ここに次のコードがあります
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の文字列値を取得するにはどうすればよいですか?
私はもう試した
var val = await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture))).Result;
しかし、「string is a waitable」というエラーが表示されます
末尾からResult
を削除します。 await
を実行すると、await-ableメソッドからResult
が返されます。
var val = await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture)));
これは古い質問に対する直接的な答えではありませんが、他の人が検索する場合:
"通常"これを行うべきではありませんが、以下のようなラッパー関数を使用できるようにライブラリ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;