例
_private void Start(object sender, RoutedEventArgs e)
{
int progress = 0;
for (;;)
{
System.Threading.Thread.Sleep(1);
progress++;
Logger.Info(progress);
}
}
_
Start()
を使用する場合に推奨されるアプローチ(TAP、TPL、BackgroundWorker、Dispatcherなど)
.NET 4.5(または.NET 4.0 + Microsoft.Bcl.Async )では、Task
ベースのAPIとasync/await
を使用するのが最善の方法です。便利な(疑似)順次コードワークフローを使用し、例外処理を構造化できます。
例:
private async void Start(object sender, RoutedEventArgs e)
{
try
{
await Task.Run(() =>
{
int progress = 0;
for (; ; )
{
System.Threading.Thread.Sleep(1);
progress++;
Logger.Info(progress);
}
});
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
もっと読む:
レポートを提供し、キャンセルを許可しながら、WPFバックグラウンドでタスクを実行する方法
4.5の非同期:非同期APIでの進行状況とキャンセルの有効化。
非同期および待機 。
これを行う最良の方法は、BackgroundWorker
を使用することです。
これを指摘する理由は、UIスレッドを使用可能にして応答性を維持したまま、バックグラウンドで作業を処理するように特別に設計されているためです。また、Progress
通知が組み込まれており、Cancellation
をサポートしています。
BackgroundWorkerの例をいくつか見てみましょう。
ここで、バックグラウンドワーカーの調査を開始すると、1つのポイントCancellation
がわかります。バックグラウンドワーカーのキャンセルプロパティを設定しても、バックグラウンドワーカーはキャンセルされません。これは、実行中のメソッドのフラグを立てて定期的に問い合わせを行い、処理を適切に停止するだけです。
これは、しばらく前にバックグラウンドワーカーのキャンセルについて話している私の投稿の1つです https://stackoverflow.com/a/20941072/1397504
最後に。非同期は、マルチコアまたはマルチスレッドを意味するものではありません。 ( [〜#〜] wiki [〜#〜] )
BackgroundWorkerクラスを使用して、WPFの別のスレッドで操作を実行できます。
この例を確認してください WPFバックグラウンドワーカーの使用方法
ここでMSDNのクラスについてお読みください http://msdn.Microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx