.NET 4.5 を使用している場合は、TPL の変更の最新バージョンにアクセスできます。これには、IProgress<T>
インターフェイスとその具体的な実装が含まれますProgress<T>
。インターフェイスは、2 つの非同期タスク間の進行状況レポート、特にバックグラウンドから UI スレッドへのレポートをサポートするように設計されています。
インターフェース自体は単純で、Report(T)
タイプの進行状況の更新をT
他のタスクに渡すためのメカニズムとしてメソッドを定義しています。進捗状況を報告する必要がある場合は、操作を呼び出します。パーセンテージの進行状況を渡したい場合は0.1
、IProgress<float>
インスタンスに渡して 10% の進行状況を報告できます。
private async Task BackgroundWorkAsync(IProgress<float> progress)
{
...
progress.Report(0.1); // 10%
...
progress.Report(1.0); // 100%
}
UI スレッドは具体的なProgress<T>
インスタンスを作成し、それをバックグラウンド タスクのスコープに渡す必要があります。Progress<T>
サブスクライブできるイベントを提供しProgressChanged
ますが、通常、進行状況が更新されるたびに呼び出されるアクションをコンストラクターに渡します。
var progress = new Progress(value => // set progress bar);
await this.BackgroundWorkAsync(progress);
Progress<T>
これは大まかな例ですが、 がコンテキスト (この場合は UI スレッド) に従ってコールバックを同期する方法の魔法を示しています。