从 Task 获取返回值。运行

我有以下密码:

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!";
}

如何从这一行返回 RunLongTask的字符串值: await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture)));

我试过了:

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

但是我得到一个错误说“字符串是不可等待的”。

125842 次浏览

从末端取出 Result。当你取出 await时,你将从 wait-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);
}

然后调用,结果如下:

string blah = WrapSomeMethod(someParam).Result;

虚函数允许您重写派生类中的函数。任务按顺序一次运行一个。任务。CompletedTask 发出函数已完成的信号。

public class BaseTest
{
public virtual Task LoadDataAsync(ITestOutputHelper output) {
for (int i = 0; i < Math.Pow(10, 5); i++)
{
output.WriteLine("Base {0}", i);
}
return Task.CompletedTask;
}
}
public class DerivedTest : BaseTest
{
public override Task LoadDataAsync(ITestOutputHelper output)
{
for (int i = 0; i < Math.Pow(10, 6); i++)
{
output.WriteLine("Derived {0}", i);
}
return Task.CompletedTask;
}
}




[Fact]
public async Task TestVirtualTask()
{
BaseTest parent_obj = new BaseTest();
DerivedTest obj = new DerivedTest();
List<Task> tasks = new List<Task>();
tasks.Add(obj.LoadDataAsync(output));
tasks.Add(parent_obj.LoadDataAsync(output));


Task.WaitAll(tasks.ToArray());
Assert.True(true);
}

您可以添加异步函数并等待 task.run。

      public virtual async Task LoadDataAsync(ITestOutputHelper output) {
await Task.Run(() =>
{
for (int i = 0; i < Math.Pow(10, 6); i++)
{
output.WriteLine("Derived {0}", i);
}
return;
});
}