2013-08-05 14 views
20

からの戻り値を取得する私はこのラインではTask.Run

public static async Task<string> Start(IProgress<ProcessTaskAsyncExProgress> progress) 
    { 
     const int total = 10; 
     for (var i = 0; i <= total; i++) 
     { 
      await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture))); 
      if (progress != null) 
      { 
       var args = new ProcessTaskAsyncExProgress 
       { 
        ProgressPercentage = (int)(i/(double)total * 100.0), 
        Text = "processing " + i 
       }; 
       progress.Report(args); 
      } 
     } 
     return "Done"; 
    } 

    private static string RunLongTask(string taskName) 
    { 
     Task.Delay(300); 
     return taskName + "Completed!"; 
    } 

ここで、次のコードを持っている:

await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture))); 

にはどうすればRunLongTaskの文字列値を取り戻すのですか?

答えて

51

を私は

var val = await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture))).Result; 

を試みた。しかし、私はエラー "という文字列がawaitableではありません" を取得端からResultを削除します。 awaitの場合は、待ち受けできる方法からResultが返されます。

var val = await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture))); 
5

これは古いの質問に直接答えではありませんが、他の人が検索する:

は「通常」あなたはこれを行うべきではありませんが、時にはあなたができるよう、ライブラリのAPIを一致させる必要があります以下のようなラッパー関数を使用します。その後、

private async Task<string> WrapSomeMethod(string someParam) 
{ 
    //adding .ConfigureAwait(false) may NOT be what you want but google it. 
    return await Task.Run(() => SomeObj.SomeMethodAsync(someParam)).ConfigureAwait(false); 
} 

、以下のように.Resultで、代わりにそのを呼び出します。

string blah = WrapSomeMethod(someParam).Result;