从Task.Run获取返回值
我在这里有以下代码
public static async Task Start(IProgress progress) { const int total = 10; for (var i = 0; i 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;
但我得到一个错误“字符串是不可等的”
从结尾删除Result
。 当您await
您将从await-able方法返回Result
。
var val = await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture)));
这不是旧问题的直接答案,而是对于其他搜索:
“通常”您不应该这样做,但有时您需要匹配库API,以便您可以使用如下的包装函数:
private async Task 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;