异步等待匿名方法
本文关键字:方法 等待 异步 | 更新日期: 2023-09-27 18:10:56
这有效
Task <string> t = Task <string> .Factory.StartNew(() => {
return "test";
});
但是如果我将其更改为以下内容会给出编译错误,为什么?
Task <string> t = Task <string> .Factory.StartNew(asyc() => {
await Thread.sleep(10000);
return "test";
});
您的问题的原因是 async
方法不返回string
而是返回Task<string>
。因此,函数的正确返回值将是 Task<Task<string>>
。请注意,创建内部任务后,外部任务将被标记为已完成,从那时起,您必须等待内部任务。
我建议您不要使用Task.Factory.StartNew
而是Task.Run
因为此函数具有重载,可以正确处理async
内部函数并解开任务。使用 Task.Run
是一个很好的一般想法,因为您很少需要像Task.Factory.StartNew
那样创建Task
。
所以我建议你将代码更改为:
Task<string> t = Task.Run(async () =>
{
await Task.Delay(10000);
return "test";
});
但是,如果您确定要使用Task.Factory.StartNew
则可以使用以下内容:
Task<Task<string>> t = Task.Factory.StartNew(async () =>
{
await Task.Delay(10000);
return "test";
});
编辑:刚刚发现您错误地使用了Thread.Sleep
。你需要一些返回一个Task
来等待它的东西(或者更确切地说是一个可等待的对象(。
延迟执行此操作的功能是 Task.Delay
.这为您提供了一个可以等待的Task
,该在设定的时间后完成。