2013-08-05 29 views
15

少し読んだところで、System.Threading.Taskに関してawaitとasyncキーワードの基本を把握していると思います。タスクを待っている:タスクを返すか、コードがないのを待ってから待ちます

私はちょっとした問題に直面しているかどうかはわかりませんが、検証を求めているのか、誰かが私を訂正するのかどうか分かりません。

私はこの署名で、非同期メソッドを実装しています:

public Task ProcessUploadedFile(FileInfo info, string contentType); 

を明らかに、私はメソッドの内部で何かを待つしたい場合は、私は、署名に非同期キーワードを追加する必要が

私の質問はこれです:私のメソッドが最後に行うことは、別の非同期メソッドを呼び出すか、タスクを返す場合、それを待っているポイントがありますか?

例:

1:

public async Task ProcessUploadedFile(FileInfo info, string contentType) 
{ 
    foreach (var something in someCollection) 
    DoSomething(); 

    DoSomethingElse(); 

    await DoMethodAsync(); 
} 

2:

public Task ProcessUploadedFile(FileInfo info, string contentType) 
    { 
     foreach (var something in someCollection) 
     DoSomething(); 

     DoSomethingElse(); 

     return DoMethodAsync(); 
    } 

私は当初、前者を書いていないが、もはやのawaitを追加することでポイントを見ることができます。もし私が後者を書いていたら、私は同じことを成し遂げました、そして両方の方法の呼び出し元は、もし彼らが選択すれば、待っているキーワードを使用することができますか?

上記に相違はありますか?どちらが「良い」ですか?

答えて

16

awaitは、完了するのを待ってメソッド本体の実行を継続するために使用されます。続けるものがなければ、待つ必要はありません。

ContinueWithの操作が完了するのを待っていると思います。だから、あなたの第一の方法のようなものがある:

foreach (var something in someCollection) 
    DoSomething(); 

DoSomethingElse(); 

DoMethodAsync().ContinueWith(t => {}); 
素敵なコードフローの絵を持っている what happens in async methodを説明する素敵なMSDNの記事があり

enter image description here

+1

グレート、それは私が考えたものだが。ありがとう! –

+1

待ってください。何かを明確にすることはできますか?あなたの書き直したバージョンのコードでは、Task.Factory.StartNew()のDoSomething()とDoSomethingElse()は正しいですか?私はこれらのビットが呼び出し元と同じスレッドで同期して実行されると考えましたか?それはDoMethodAsync()です。ContinueWith(t => {} _); ? –

+1

@dark_perfect申し訳ありませんが、急いでいました。そしてはい、あなたは完全に正しいです。更新されたコード –

関連する問題