2012-04-07 10 views
0

私は非同期CTPでいくつかのプローブを作っていますが、GUIがブロックされているので良い結果を得られません。async CTP:何かが間違っている、GUIがブロックされている

私はボタンとログ用のテキストボックスを持つWPFアプリケーションを持っています。間違っていないよ場合(この場合はイベントをクリックしてください)「同期」との方法を設定し、それがメソッドに実行にポイントを戻すために、方法はのawaitを使ってみましょう、

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); 
     } 

:それから私はこのコードを持っています実際のメソッドを呼び出すと、実行はGUIに戻ります。

GUIでは、ボタンをクリックしてから、slowMethodを待つclickイベントで、slowMethodを使ってどのように待っているのですか?コントロールはGUIに返され、GUIはブロックされません。ただし、GUIはブロックされており、slowMethodが終了するまでtxtLogは情報を表示しません。

これはslowMethodがGUIと同じスレッドで実行されるためですか?私が間違っている場合、asyncは通常、awaitメソッドを呼び出すメソッドと同じスレッドを使用しますが、非同期の理由がこれを回避すると思います。

slowMethodをthread.Seepなしでシミュレートするにはどうすればよいですか? slowMethodではスレッドをスリープさせ、slowMethodのスレッドはGUIと同じであるため、おそらくこれが問題です。

これは、私はいつも非同期メソッドのコードを他のスレッドで実行することをお勧めしていると思いますか?これが正しければ、私はメインスレッドをブロックしないためにタスクを使用する必要がある場合は非同期を使用する意味ですか?

非同期を使用するタイミングとタスクを使用するタイミングを教えてください。このプローブについて

が、私はこのウェブの例を以下しています。この例ではhttp://www.codeproject.com/Articles/127291/C-5-0-vNext-New-Asynchronous-Pattern

、それがslowMethodとしてclient.DownloadStringTaskAsyncを使用していますが、私の場合は、代わりにWebクライアントを使用しての、私はダミーのメソッドを使用しますslowMethodをシミュレートするためにスリープ状態にします。私はそれがユニークな違いだと思う。

ありがとうございました。 ダイムロク。

答えて

2

await TaskEx.Delay(5000)を使用して待機すると、の非同期スリープ/ディレイを実行します。

async/awaitについてさらにお読みください。いくつかの良いChannel9ビデオがあります。 Stephen Toub、Eric Lippert、その他多くのMicrosoftブロガーが優れた概要を持っています。 Jon Skeetの「eduasync」ブログシリーズも、のためには本当にになります。私はan async intro on my own blogを書いてきました。

  • asyncキーワードのみawaitキーワードを可能にします:ここで

    asyncawaitは本当に一言で言えば、どのように動作するかです。それだけです。 ではなく、バックグラウンドスレッドでメソッドを実行します。

  • awaitは、 "awaiter"が完了していない場合にのみ非同期で動作します。

あなたのケースでは、btnAsync01_ClickslowMethodAsyncの両方がUIスレッドで実行されます。 slowMethodAsyncは同期して実行され(Thread.Sleep)、btnAsync01_Clickに戻ります。これは既に完了したタスクを待ちます。タスクは既に完了しているので、btnAsync01_ClickはUIメッセージループに応答せずに実行を継続するだけです。

あなたはawait TaskEx.DelayThread.Sleepを交換する場合は、btnAsync01_Clickは、UIスレッドで実行を開始します、と(もUIスレッド上で実行されている)slowMethodAsyncを呼び出します。 slowMethodAsyncawaitが遅延(完了していない)の場合、不完全なタスクをbtnAsync01_Clickに返します。 btnAsync01_Clickawaitになります(完了していません)。UIループに戻ります。

遅延が期限切れになると完了し、(UIスレッドで)slowMethodAsyncが再開します。 slowMethodAsyncが完了すると、返されたタスクは完了し、btnAsync01_Clickが(UIスレッド上で)再開します。

関連する問題