异步等待匿名方法

本文关键字:方法 等待 异步 | 更新日期: 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,该在设定的时间后完成。