web-dev-qa-db-ja.com

WPFアプリケーションでバックグラウンドでタスクを実行する

_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など)

  1. uIスレッドをブロックしない
  2. 進捗レポートを提供する
  3. キャンセル可能
  4. マルチスレッドをサポート
14

.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での進行状況とキャンセルの有効化

非同期および待機

非同期/待機FAQ

24
noseratio

これを行う最良の方法は、BackgroundWorkerを使用することです。

これを指摘する理由は、UIスレッドを使用可能にして応答性を維持したまま、バックグラウンドで作業を処理するように特別に設計されているためです。また、Progress通知が組み込まれており、Cancellationをサポートしています。

BackgroundWorkerの例をいくつか見てみましょう。

ここで、バックグラウンドワーカーの調査を開始すると、1つのポイントCancellationがわかります。バックグラウンドワーカーのキャンセルプロパティを設定しても、バックグラウンドワーカーはキャンセルされません。これは、実行中のメソッドのフラグを立てて定期的に問い合わせを行い、処理を適切に停止するだけです。

これは、しばらく前にバックグラウンドワーカーのキャンセルについて話している私の投稿の1つです https://stackoverflow.com/a/20941072/1397504

最後に。非同期は、マルチコアまたはマルチスレッドを意味するものではありません。 ( [〜#〜] wiki [〜#〜]

5
Nico

BackgroundWorkerクラスを使用して、WPFの別のスレッドで操作を実行できます。

この例を確認してください WPFバックグラウンドワーカーの使用方法

ここでMSDNのクラスについてお読みください http://msdn.Microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

1
StackTrace