0

BackgrounderWorker を使用していくつかの作業を行う 2 つのメソッドがあります。最初の方法を実行すると、バックグラウンドでいくつかの作業が行われ、2 番目の方法についても同じことが言えます。しかし、私が望むのは、メソッド 1 のワーカーが開始されるまで、2 番目のメソッドを待機することです。

コード

private void Method1(object sender, RoutedEventArgs e)
{
    RunFirstWorker();
}

private void Method2(object sender, RoutedEventArgs e)
{
    RunFirstWorker();
    RunSecondWorker();
}
4

3 に答える 3

2

イベント オブジェクト (ManualResetEventまたはAutoResetEvent) を使用して、これらの関数の実行を同期できます。非シグナル状態でイベントを作成し、RunSecondWorker()DoWorkイベント ハンドラの先頭で待機します。RunFirstWorker()DoWorkイベント ハンドラの最後で、このイベントの状態をシグナル状態に設定します。

元のコード スニペットMethod1()Method2()は、GUI コールバック (GUI スレッドで実行されるメソッド) だったので、それらをブロックしたくありません (これらのメソッド自体でイベントを待ちたくはありませんが、BackgroundWorker コールバック -DoWorkイベント ハンドラー) 。 .

于 2013-01-29T12:58:23.320 に答える
0

おそらく、F1 で IAsyncResult を返し、それを f2 のワーカーに渡し、f2 ワーカーの開始時に AsyncWaitHandle で waitone を呼び出しますか?

http://msdn.microsoft.com/en-us/library/system.iasyncresult.aspxを参照してください

@Nikita - F1 および F2 内からの呼び出しを意味するものではありませんでした。元のポスターは、バックグラウンド ワーカーを使用していると述べています。

于 2013-01-29T12:45:39.753 に答える
-1

編集済み:(他の回答を見て)OK-問題は、F1をいつ、どのように待つかです。BackgroundWorker には、メイン スレッドで実行される RunWorkerCompleted イベントがあります。そこで何らかのロジックを実行し、それが完了するのを待つ必要がある場合、待つことができず、デッドロックが発生します。1 つのオプションは、 Application.DoEvents() を使用してメッセージをポンプアップすることですが、予期しない動作が発生する可能性があります。

于 2013-01-29T12:47:59.783 に答える