2016-07-22 9 views
2

私はC#とWPFを使用してVisual Studio 2015でプロジェクトを開発しています。時々、私はcloseコマンドで実行中のプロジェクトを終了し、時にはstop debugボタンで終了します。問題は、いくつかのテストの後に、私のPCが暖かくなり、ファンが騒音を発することです。私はマシンを落ち着かせるためにVisual Studioを終了する必要があります。スレッドが正しく終了していない参照

  • どのようにテストした後に終了していないスレッドを参照するには:

    は、だから私は疑問を持っていますか?

  • 私がそれらを知っているとき、それらをいかに適切に終了するのですか? (実際にのスレッドがある場合WindowClosing
  • デバッグの停止ボタンを使用するとスレッドが正しく終了するようにしますか?

    タスクマネージャのスクリーンショットがあります:

はあなたに

EDITありがとうございます。アプリケーションを起動すると、CPUが5%から15%(またはイベント25%)に上昇します。 RAMは4GOから4.5に上昇します。 アプリケーションを停止すると、CPUは数秒間45%に戻り、5%に戻りますが、RAMは4.70GOに戻り、戻りません。

task manager

EDIT2:

私は自分のアプリケーション上のスレッドは、この種の設立:スレッドを使用するために本当に良い方法があるかどう

private bool isClosing = false; 
public void Start() 
{ 
    isClosing = false; 
    ThreadPool.QueueUserWorkItem(new WaitCallback(doWorkThread)); 
} 

public void Stop() 
{ 
    isClosing = true; 
} 

private AutoResetEvent endPoolStateButton = new AutoResetEvent(false); 
private void doWorkThread(object sender) 
{ 
    Action action = new Action(() => doWork()); 
    while (!isClosing) 
    { 
     Thread.Sleep(100); 
     this.Dispatcher.BeginInvoke(action, System.Windows.Threading.DispatcherPriority.Background); 
    } 
    endPoolStateButton.Set(); 
} 

private void doWork() 
{ 
    /* Job performed */ 
} 

かしら?アプリケーションをisClosing = trueを設定せずに閉じると、決して停止しません。スレッドは決して実際に中断されませんか?あなたはこの種のスレッドが私の持つすべてのトラブルを引き起こすと思いますか?

+0

は、タスクマネージャを見て、何が起こっているかチェックしてください。あなたがそれを「閉じた」後にアプリがまだ動いている場合。大量のRAMが必要な場合CPUが100%で動作している場合... –

+0

新しいスレッドをどのように開始し、どのように終了するのですか?そして、「いくつかのスレッドを処理する」とはどういう意味ですか?スレッドは使い捨てではありません。また、アプリケーションの終了前にすべてのフォアグラウンドスレッドを終了させる必要があります。 – Luaan

+0

私はこのアプリケーションの唯一の開発者ではありません、私はそれに取り組む前にいくつかの機能が開発されています。だから私はすべてのスレッドが開始/終了hawを知らないので、私は質問をしています。たとえば、私はバックグラウンドウォーカーを使用し、それを中止します(Disposeではなく、間違いのために申し訳ありません)[そこから作成](http://stackoverflow.com/questions/800767/how-to-kill-background-worker-completely) –

答えて

0

ような何かを試してみてください。コードが明確であることを願っています。私は、スレッドの取り消しを待つスレッドとManualResetEventでの操作をキャンセルするCancellationTokenを使用します。

namespace ElegantThreadWork 
{ 
    using System; 
    using System.Threading; 
    using System.Diagnostics; 

    class ThreadObject 
    { 
     public CancellationToken CancellationToken { get; private set; } 
     public ManualResetEvent WaitHandle { get; private set; } 

     public ThreadObject(CancellationToken ct, ManualResetEvent wh) 
     { 
      CancellationToken = ct; 
      WaitHandle = wh; 
     } 
    } 
    public class Program 
    { 
     static void DoWork(CancellationToken ct) 
     { 
      Console.WriteLine("Thread[{0}] started", Thread.CurrentThread.ManagedThreadId); 
      int i = 0; 
      // Check for cancellation on each iteration 
      while (!ct.IsCancellationRequested) 
      { 
       // Do something 
       Console.WriteLine("Thread[{0}]: {1}", Thread.CurrentThread.ManagedThreadId, i); 
       // Wait on CancellationToken. If cancel be called, WaitOne() will immediatly return control! 
       // You can see it by elapsed time 
       ct.WaitHandle.WaitOne(TimeSpan.FromSeconds(1)); 
       i++; 
      } 
      Console.WriteLine("Thread[{0}] has been cancelled", Thread.CurrentThread.ManagedThreadId); 
     } 
     static void ThreadProc(object state) 
     { 
      ThreadObject to = (ThreadObject)state; 
      try 
      { 
       DoWork(to.CancellationToken); 
      } 
      finally 
      { 
       to.WaitHandle.Set(); 
      } 
     } 
     public static void Main(string[] args) 
     { 
      TimeSpan MAX_THREAD_EXITING_TIMEOUT = TimeSpan.FromSeconds(5); 

      // Use for elegant thread exiting 
      ManualResetEvent isThreadExitedEvent = new ManualResetEvent(false); 
      CancellationTokenSource cts = new CancellationTokenSource(); 
      ThreadObject threadObj = new ThreadObject(cts.Token, isThreadExitedEvent); 

      // Create thread 
      Thread thread = new Thread(ThreadProc, 0); 
      thread.Start(threadObj); 

      Console.WriteLine("Just do something in main thread"); 

      Console.WriteLine("Bla."); 
      Thread.Sleep(1000); 

      Console.WriteLine("Bla.."); 
      Thread.Sleep(1000); 

      Console.WriteLine("Bla..."); 
      Thread.Sleep(1000); 

      Console.WriteLine("Thread cancelattion..."); 
      Stopwatch sw = Stopwatch.StartNew(); 
      // Cancel thread 
      cts.Cancel(); 

      // Wait for thread exiting 
      var isOk = isThreadExitedEvent.WaitOne(MAX_THREAD_EXITING_TIMEOUT); 
      sw.Stop(); 
      Console.WriteLine("Waiting {0} for thread exiting. Wait result: {1}. Cancelled in {2}", MAX_THREAD_EXITING_TIMEOUT, isOk, sw.Elapsed); 

      // If we couldn't stop thread in elegant way, just abort it 
      if (!isOk) 
       thread.Abort(); 
     } 
    } 
} 
+0

私はこの解決策を試してみる前に、このアプリケーションで作成されたすべてのスレッドをリストする必要があり、そのリストは長いです...スレッドのほとんどはタイプ 'while(!close){...}'です。決して中止されません。私はそれらすべてをきれいにするのは難しい仕事があります。 –

+0

これらのスレッドの作成を制御する場合は、[Thread.IsBackground](https://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground(v = vs.110).aspx)を使用します。バックグラウンドスレッドはフォアグラウンドスレッドと同じですが、バックグラウンドスレッド**はプロセスの終了を妨げません**。 –

-1

「Process Hacker」ツールを使用して、プロセスとスレッドの動作を監視することができます。このツールを使用すると、スレッドに関するより詳細な情報が得られ、デーモンスレッドを検出することもできます。

もう一つの方法は次のようになります。エレガントな方法でスレッドを停止する方法my solutionあるメインプロセスのすべての子スレッドを取得し、ここで

Thread t1; // specific child thread 
t1.join(); 
関連する問題