2016-12-07 5 views
0

私はC#TAPコーディングを勉強し始めています。コードが同期タスクベースの非同期パターンを理解するC#

async private void timer1_Tick(object sender, EventArgs e) 
    { 
     SyncCount++; 
     result1.Text = SyncCount.ToString(); 

     AsyncCount = await CountForALongTimeAsync(AsyncCount); 
     result2.Text = AsyncCount.ToString(); 
    } 

    async Task<int> CountForALongTimeAsync(int counter) 
    { 
     Thread.Sleep(3000); 
     counter++; 
     return counter; 
    } 
+6

変更' Thread.Sleep'はTask.Delay'を待っています。 – Sinatr

+0

同期または非同期の理解はどうですか?私は非同期関数が(値渡しの)パラメータを1つ増やして戻ってくるのを見ています... –

+2

'CountForALongTimeAsync'メソッドには' await'式がないので、同期して実行されるという警告が表示されます。非同期の仕組みについてのチュートリアルを読むべきではないでしょうか。単に非同期の修飾子を追加するだけではなく、すべてが非同期になるという魔法ではありません。それは合理的に徹底的に理解する価値があります。 –

答えて

4
実際にいくつかの待機(それは与えられた呼び出しはすべてを持っている可能性がありますしない最初の await編の非同期呼び出しまで実行されます次に来る何
async Task<int> CountForALongTimeAsync(int counter) 
{ 

実行されている理由を私は理解していないことすぐに戻る必要があります。たとえば、インターネットに接続したり、キャッシュからデータを返す可能性のあるサービス(待機しない場合など)などです。

edコールはまったくありません。したがって、Taskが返されました。すでに完了しています。

呼び出されたawait CountForALongTimeAsyncはすでに完了したタスクが完了するとawaitになるため、同期して実行されます。この方法は、として良いだろう

:ちなみに

async Task<int> CountForALongTimeAsync(int counter) 
{ 
    await Task.Delay(3000); 
    counter++; 
    return counter; 
} 

、似たような非常に(ただし、完全に)やっての事前await方法があったであろう:

Task<int> CountForALongTimeAsync(int counter) 
{ 
    return Task.Delay(3000).ContinueWith(t => 
    { 
     ++counter; 
     return counter; 
    }); 
} 

は、これらが異なっていることを考慮しますタスクの後に「続ける」という考えは、ある程度の洞察を与えるかもしれないし、しないかもしれない。これとは対照的に

あなたの質問のコードだったん何をしての最も近い事前待つ方法: `へ

Task<int> CountForALongTimeAsync(int counter) 
{ 
    Thread.Sleep(3000); 
    counter++; 
    return Task.FromResult(counter); //FromResult returns an already completed task. 
} 
関連する問題