2017-03-27 6 views
0

は、私は永遠に実行されるいくつかのバックグラウンドタスクを持って、私はそうのようにそれを作成します。Task.Runアクション内のTask.DelayにConfigureAwait(false)を使用する必要がありますか?私のWPF MVVMアプリで

Task.Run(async() => 
{ 
    while (true) 
    { 
     if (IsStarted) 
     { 
      // Do some processing and update the UI via bound properties. 
     } 

     await Task.Delay(300); 
    } 
}); 

私はそれがawait Task.Delay(300).ConfigureAwait(false);に変更すべきか?私は周りを見渡すことはできませんが、既にスレッドプールスレッドから待っているので、重複しているように思えます。

+1

ので、それがあなたの場合には、実行連続関係ありません - あなたは '' .ConfigureAwait(false)を使用する必要があります - あなたはループ – Fabio

答えて

2

Task.Delay(300).ConfigureAwait(false);を待つように変更する必要がありますか?私は周りを見渡すことはできませんが、既にスレッドプールスレッドから待っているので、重複しているように思えます。

このメソッドには、最初にキャプチャするコンテキストがないため、冗長です。

しかし、文体の好みとして、私はまだそれを使用します。 ConfigureAwait(false)の存在は、このメソッドの残りの部分が元のコンテキストで再開する必要がないことをコードの読者に通知します。

1

あなたの非同期タスクは、お待ちください。

dispatcherTimer_Tick().DoNotAwait(); 

あなたのAsyncタスクは、UIを散漫にすることなく10秒ごとに実行されます。必要に応じて変更することができます。このようなやり方をすることで、あなたのUIは決して打撃を受けたり、ハングしたりすることはありません。

private async Task dispatcherTimer_Tick() 
{ 
    DispatcherTimer timer = new DispatcherTimer(); 
    TaskCompletionSource<bool> tcs = null; 
    EventHandler tickHandler = (s, e) => tcs.TrySetResult(true); 

    timer.Interval = TimeSpan.FromSeconds(10); 
    timer.Tick += tickHandler; 
    timer.Start(); 

    while (true) 
    { 
     tcs = new TaskCompletionSource<bool>(); 

     await Task.Run(() => 
     { 
     // Run your background service and UI update here 
     await tcs.Task; 
    } 

} 
+0

の遅延を実行したとき、それはあなたのケースで、より効率的になりますので、あなたが利益を見ています私が使っているものよりもこのアプローチの方がいいですか?あなたのアプローチを使ってタイミングがより正確かもしれないようです。 「もう一度待つのではなく、仕事をしなさい、私のように2番目に待ってください、あなたのことは「毎秒、仕事をしてください」。 – user1676558

0

達成できるのは、DispatcherTimerクラスです。

まず、クラスを次のように初期化する必要があります。

DispatcherTimer myBackGroundProcess=new DispatcherTimer(); 

このように、DispatcherTimerオブジェクトにイベントを登録する必要がありました。 TimeSpan

myBackGroundProcess.Tick += new EventHandler(myBackGroundProcess_Tick); 
myBackGroundProcess.Interval = new TimeSpan(0, 2, 0); 
myBackGroundProcess.Start(); 

あなたはそれが(時、分、秒)で引数を取るあなたのメソッドを呼び出すためにあなたの時間を挙げることができます。

最後に、DispatcherTimerオブジェクトで登録したメソッドを記述する必要があります。

public void myBackGroundProcess_Tick() 
{ 
    //Do Something 
} 

私のコードでは、私の方法myBackGroundProcess_Tick()は2分ごとに毎回永遠に呼び出します。

+0

さて、これは理にかなっていますが、別のことをしているようです。私が知っている限り、これはUIスレッドを「何かする」ために使用しますが、私のコードはその処理をスレッドプールスレッドに保持しています。 – user1676558

関連する問題