1

WPF の本を読んでいると、次のコードが表示されます。

    private void bgw1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        int percenti;
        percenti = e.ProgressPercentage;
        progressBar1.Value = percenti;
    }

質問は簡単です。もしも

ProgressBar は UI スレッドに属し、BackGroundWorker はバックグラウンド スレッドで動作します

エラーがないのはなぜですか (たとえば、別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません)。

ありがとう。

4

3 に答える 3

3

エラーがないのはなぜですか (たとえば、別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません)。

これは、 を使用する主な利点の 1 つですBackgroundWorker。BackgroundWorker コンポーネントは、進行状況と完了の呼び出しを、ジョブを開始する同期コンテキスト (スレッド) に自動的にマーシャリングします。

この場合、ProgressChanged(および完了イベント) のイベント ハンドラーが WPF UI スレッドで発生することを意味します。

于 2012-05-16T22:40:39.457 に答える
2

BackgroundWorker、スレッド コンテキスト スイッチを処理します。イベントBackgroundWorker.ProgressChangedは UI スレッドで発生するため、コールバックbgw1_ProgressChangedは UI スレッドのコンテキストで呼び出されます。

これが の存在の主な目的でしたBackgroundWorker。UI と組み合わせて、非同期作業を簡単かつ簡単にすることです。

BackgroundWorker.NET 1.0 から存在します。2012 年に生きている今、TaskクラスとTask Parallel Libraryasyncがあり、すぐにすべての非同期の一般的な手段としてc#キーワードがBackgroundWorkerあり、時代遅れまたは少なくとも古い学校になります。

于 2012-05-16T22:37:33.073 に答える