非同期CTPを使用していくつかのプローブを作成していますが、GUIがブロックされているため、良い結果が得られません。
ボタンとログ用のテキストボックスを備えたWPFアプリケーションがあります。それから私はこのコードを持っています:
private async void btnAsync01_Click(object sender, RoutedEventArgs e)
{
UpdateTxtLog("Enter in Button Async01: " + System.DateTime.Now);
await metodo01Async();
UpdateTxtLog("Exit button Async01: " + System.DateTime.Now);
}
private async Task slowMethodAsync()
{
UpdateTxtLog("Enter in slowMethod: " + System.DateTime.Now);
Thread.Sleep(5000);
UpdateTxtLog("Exit slowMethod: " + System.DateTime.Now);
}
間違っていない場合は、「sync」(この場合はクリックイベント)でメソッドを設定します。メソッドはawaitを使用して、実行ポイントを実際のメソッドを呼び出すメソッドに戻し、実行はGUIに戻ります。 。
したがって、GUIでボタンをクリックし、クリックイベントでslowMethodを待機します。slowMethodでawaitを使用する方法では、コントロールがGUIに返され、GUIがブロックされないようにする必要があります。ただし、GUIはブロックされ、slowMethodが終了するまでtxtLogには情報が表示されません。
これは、slowMethodがGUIと同じスレッドで実行されるためですか?私が間違っている場合、非同期では通常、awaitメソッドを呼び出すメソッドと同じスレッドを使用しますが、非同期の理由はこれを回避すると思います。
thread.SleepなしでslowMethodをシミュレートするにはどうすればよいですか?おそらくこれが問題です。slowMethodではスレッドをスリープ状態にし、slowMethodのスレッドはGUIと同じだからです。
これにより、非同期メソッドのコードを他のスレッドで実行することが常に推奨されていると思いますか?これが正しければ、メインスレッドをブロックしないためにタスクを使用する必要がある場合、非同期を使用する意味はどれですか?
いつ非同期を使用し、いつタスクを使用するのですか?
このプローブについては、次のWebの例に従っています:http://www.codeproject.com/Articles/127291/C-5-0-vNext-New-Asynchronous-Pattern
この例では、slowMethodとしてclient.DownloadStringTaskAsyncを使用していますが、私の場合、WebClientを使用する代わりに、slowMethodをシミュレートするためにスリープを使用したダミーメソッドを使用しています。それがユニークな違いだと思います。
ありがとう。ダイムロック。