2017-06-07 4 views
0

私は実行を開始する2つのスレッドを持っていますユーザーが再生ボタンを選択したとき。 しかし、「一時停止」または「再開」ボタンを選択すると、Thread.Join()が原因でUIがハングします。UIフリーズ問題を克服するThread.Join()の代替手段は何ですか

以下はコードですが、私はこれを克服するための代替手段を探しています。 私は既にInvokeで試してみましたが、この方法でもUIのUIがフリーズしてもスレッドメソッドを呼び出せません。

ThreadStart m_executeThreadStart; 
     Thread m_executeThread; 
     //user Selected Start Button 
     private void Start() 
     { 
      m_executeThreadStart = new ThreadStart(method1); 
      m_executeThread = new Thread(m_executeThreadStart); 
      m_executeThread.Name = "ExecuteTestSession"; 
      m_executeThread.IsBackground = true; 
      m_executeThread.Start(); 

      // Start the asynchronous operation. 
      // InitializeBackgroundWorker(); 
      // backgroundWorker1.RunWorkerAsync(); 

      //Creating result sync thread 
      ThreadStart m_resultSyncThreadStart = new ThreadStart(method2); 
      Thread m_resultSyncThread = new Thread(m_resultSyncThreadStart); 
      m_resultSyncThread.Name = "SyncResultDatabase"; 
      m_resultSyncThread.Start(); 
     } 
     private void method1() 
     { 
      //do some work 
      //read data from OPC sever (device) 
     } 
     private void method2() 
     { 
      //do some work 
      //updated database accordingly method 1 data 
     } 

     //user Press Pause button 
     public void Suspend() 
     { 
      //do work 
      m_executeThread.Join(); 
      //do work 
     } 

     //user Press Resume button 
     public void Resume() 
     { 
      //do work 
      m_executeThread.Join(); 
      //do work 
     } 
+0

「結合」をなぜ実行しているのかは不明です。 'Join'の前に' Suspend'/'Pause'からスレッドをシャットダウンしようとしていますか?もしそうなら、あなたが投稿したコードから*これをやっている方法の詳細を完全に削除しました。もしそうでなければ、なぜあなたはそれらのポイントをヒットしたときにスレッドが終了すると思いますか? –

+0

@Damien_The_Unbelieverユーザーがメソッド1から読み込んだデータの量に対して一時停止をクリックすると、データベースの更新プロセスを完了しようとしています。たとえば、1000のデータがあり、50のデータを読み込んだ後、一時停止をクリックします。 。 –

答えて

0

、以下の答えのためのリンクです。

How to pause/suspend a thread then continue it?

ManualResetEvent mrse = new ManualResetEvent(true);  

ThreadStart m_executeThreadStart; 
     Thread m_executeThread; 
     //user Selected Start Button 
     private void Start() 
     { 
      m_executeThreadStart = new ThreadStart(method1); 
      m_executeThread = new Thread(m_executeThreadStart); 
      m_executeThread.Name = "ExecuteTestSession"; 
      m_executeThread.IsBackground = true; 
      m_executeThread.Start(); 

      // Start the asynchronous operation. 
      // InitializeBackgroundWorker(); 
      // backgroundWorker1.RunWorkerAsync(); 

      //Creating result sync thread 
      ThreadStart m_resultSyncThreadStart = new ThreadStart(method2); 
      Thread m_resultSyncThread = new Thread(m_resultSyncThreadStart); 
      m_resultSyncThread.Name = "SyncResultDatabase"; 
      m_resultSyncThread.Start(); 
     } 
     private void method1() 
     { 
      //do some work 
      //read data from OPC sever (device) 
       mrse.WaitOne(); 
     } 
     private void method2() 
     { 
      //do some work 
      //updated database accordingly method 1 data 
       mrse.WaitOne(); 
     } 

     //user Press Pause button 
     public void Suspend() 
     { 
      //do work 
      mrse.Reset(); 
      //do work 
     } 

     //user Press Resume button 
     public void Resume() 
     { 
      //do work 
      mrse.Set(); 
      //do work 
     } 

はあなたの助けに感謝しました。

-1

イベントハンドラをバックグラウンドワーカーに追加すると、Thread.Join()は必要ありません。長期実行中のプロセスが完了したときにあなたのイベントハンドラは、その後、必要なアクションを実行することができます

backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // code to run after long running process has completed 
} 

非同期/のawaitパターンを使用すると、別のアプローチとしてこれを使用することができます(正しく実装時)凍結からUIを停止するように設計されました - https://docs.microsoft.com/en-us/dotnet/csharp/async

も参照してください。私は解決策を設立https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/keep-the-ui-thread-responsive

+0

回答に追加されたコード – J45

関連する問題