2013-01-13 15 views
5

に現在のタスクインスタンスを取得します - それは私はそうのような非同期メソッド本体をお持ちの場合は非同期メソッド本体

にするときのawaitキックユーザに返される前に、私はTaskオブジェクトを取得できますか

public async Task GetSomething() { 

    await SendText("hi"); 
    await SendImage("bla.bmp"); 

} 

すなわち..ので、どこか別の場所

public async Task GetSomething() { 

    myTasks.Add(Task.Current); 
    await SendText("hi"); 
    await SendImage("bla.bmp"); 

    //some processing 

} 

私が行うことができます

await Task.WhenAll(myTasks); 
Console.WriteLine("All tasks complete"); 

シャットダウンする前にすべてのタスクが完了するのを待つことができるようにする

+0

'SendText'と' SendImage'の署名は何ですか? – oleksii

+0

違いはありません。これは、GetSomethingが複数の子演算を実行することを示すダミーコードです。それらを明確にする場合は、Thread.Sleep(50000)に置き換えてください。 – NoPyGod

+0

はい、あります。 'Task'または' Task 'であれば' void'、 'Task'と' Task 'を返すことができ、コードをリファクタリングすることができます。タスクオブジェクトを取得して単一の配列に追加できます。 – oleksii

答えて

4

「現在の」タスクにアクセスする機能がないため、これは直接できません。

ただし、回避策があります。別の方法で非同期メソッドをラップします。この他のメソッドは、非同期メソッドが返すとタスクを保持することができます(おおよそ最初の待機ポイントで発生します)。

すべての場合、非同期メソッド自体ではなく、呼び出し元にリストに非同期タスクを追加させることをおすすめします。これはカプセル化の観点からも有用です。

+0

あなたが正しいように見えます。私は、これが私が何か間違っていることを意味しているのか、そういったユースケースがこれまで考えられていないのかどうかはわかりません。私はすべての非同期メソッドを追跡することはかなり一般的であると考えていたでしょう。私は内部関数でコードをラップすることによってコードを醜くする必要があると思います。 – NoPyGod

関連する問題