2016-12-09 16 views
4

非同期タスクを現時点で開始せずに作成したいと考えています。私は私の関数に戻り値を追加した例外を処理する。しかし型付き非同期タスクの作成

private Task CreateTask() { 
     return new Task(
      async() => await DoSomething().ConfigureAwait(false)); 
    } 

:型指定されていないタスクを は問題ありません。しかし、どのようにして正しい構文で書くことができますか:

private Task<bool> CreateTask() { 
     return new Task<bool>(
      async() => await DoSomething().ConfigureAwait(false)); 
    } 

非同期ラムダ式をfuncに変換できないというメッセージが表示されます。 だから私の質問:どのように正しく書かれていますか?

+1

どちらの方法が間違っています。 'DoSomething()'はすでに実行中のタスクを返しているので、 'return(Task)DoSomething();'のようにそのまま返すことができます。 'await' *はすでに実行中のタスクが完了するのを待っています。非同期に開始することはありません。 'new'でコールドタスクを作成する理由はありません。 2番目のケースでは、値は何であるはずですか? –

+1

[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のようなものです。あなたはXに問題があります.Yが解であると思って、それがうまくいかないときYについて質問してください。解決したい*実際の問題は何ですか? –

+0

例外ハンドラで 'await'呼び出しを囲む例外処理は、同期メソッドの場合と同じです。 'await'は元の例外をスローします。 try {.... await CallMyServer();} catch(WebException exc)と同じように、 'try {.... await CallMyServerAsync();} catch(WebException exc){...} ){{}} 'CallMyServer'がブロッキングメソッドである場合 –

答えて

3

現時点で非同期タスクを開始しないで作成します。

これは、解決しようとしている問題が何であれ間違った解決策です。あなたが将来的に実行したいコードを定義したい場合は、デリゲートを使用する必要があります

private Func<Task> CreateTaskFactory() 
{ 
    return async() => await DoSomething().ConfigureAwait(false); 
} 

をしかし、私は私の関数に戻り値を追加した例外を処理します。

また、これは最適な解決策ではありません。タスクでは、既に追加のコードを書くことなく例外は正常に理解されています。

あなたはを行う場合、あなたはTask<T>を作成するデリゲートを返すことができます(データとして)値を返す必要があります。

private Func<Task<int>> CreateTaskFactory() 
{ 
    return async() => await DoSomethingReturningInt().ConfigureAwait(false); 
} 
+0

' CreateTaskFactory'は単に 'return DoSomething();'にすることができます。 'async'デリゲートには利点はありません。 – Servy

+0

@Servy:オペレーションを今すぐ定義したいと思っていますが、後でオペレーションを開始したいと思っています。 –

+0

申し訳ありませんが、 'return()=> DoSomething();' – Servy