2011-02-09 11 views
2

私はWPFでアプリケーションを書いています。私は1つのメインスレッドと別の1つを持っています - 私は何かを計算します。メインスレッドでは、追加のスレッドが完了した後に1つの操作を行う必要があります。私はメインスレッドをブロックしたくないので、追加スレッドのためにJoinを使用することはできません。どのように私は2番目のスレッドを終了し、同時にメインスレッドをブロックしないで待つことができますか?WPFのスレッドに関する問題

答えて

3

一番良い方法は、backgroundworkerを使用してRunWorkerCompletedイベントを処理することです。

私も3 のジョゼフ・アルバハリのThreading in C# pdf

+0

うーん、私はそれが最善の解決策ではないと思います。キャンセルボタンをクリックすると、この追加のスレッドをキャンセルしたいと思います。私はバックグラウンドワーカーがCancelAsync()メソッドを持っていることを知っていますが、バックグラウンドワーカーで行うべきメソッドは独立して実行しています。私はこの機能で私は私が壊れる可能性がループがないが、私はちょうど最適化にシステム機能を呼び出すと私はそれを壊すことはできません。 @ ravenik。 – ravenik

+0

どのソリューションを選択してもこの問題はありませんか? 'if(_bw.CancellationPending){e.Cancel = true;戻る; } '' e.result'を十分に設定する前に? –

2

もう一つの簡単な方法は、continuationsとタスク並列ライブラリやチェーン複数のタスクを使用することです見て参加することを勧めます。

@コンラッドのアドバイスからあなたを免除するわけではありませんが、the threading bookを読んでください。それは魅力的で、努力の価値があります。

+0

@Anvanka +1続きは非常に良い選択肢です –

0

独自のスレッドを作成している場合に行うの時に、ワーカースレッドがコールバックメソッドを呼び出しています

public delegate void DoneDelegate (object calculationResults); 
public class MyWorker 
{ 
    public DoneDelegate Done { get; set; } 
    public void Go() 
    { 
     object results = null; 
     // do some work 
     Done(results); 
    } 
} 

public class Main 
{ 
    public void StartWorker() 
    { 
     MyWorker worker = new MyWorker(); 
     worker.Done = new DoneDelegate(DoneCallback); 
     System.Threading.Thread thread = new System.Threading.Thread(worker.Go); 
     thread.IsBackground = true; 
     thread.Start(); 
    } 
    public void DoneCallback (object results) 
    { 
     // use the results 
    } 
}