如何在没有 Func<> 变量的异步委托上创建任务

本文关键字:异步 任务 创建 变量 Func | 更新日期: 2023-09-27 18:30:52

我有以下代码:

DateTime start = DateTime.Now;
Func<Task<double>> f = async () =>
{
    await Task.Delay(3000, cts.Token);
    return (DateTime.Now - start).TotalMilliseconds;
};
Task<double> delayTask = f();

但是我无法弄清楚如何在不先将委托分配给变量的情况下将其编写为单个语句。也就是说,我觉得我应该能够做一些类似的事情

Task<double> delayTask = (async () =>
{
    await Task.Delay(3000, cts.Token);
    return (DateTime.Now - start).TotalMilliseconds;
})();

甚至

Task<double> delayTask = new Task<double>(async () =>
{
    await Task.Delay(3000, cts.Token);
    return (DateTime.Now - start).TotalMilliseconds;
});

但两者都会给出编译错误。我错过了什么?

如何在没有 Func<> 变量的异步委托上创建任务

我认为

您要查找的是:

Task<double> delayTask = new Func<Task<double>>(async () => 
{  
    await Task.Delay(3000, cts.Token); 
    return (DateTime.Now - start).TotalMilliseconds; 
})();

您收到错误的原因与无法编译此错误的原因相同:

var f = async () =>
{
    await Task.Delay(3000, cts.Token);
    return (DateTime.Now - start).TotalMilliseconds;
};

必须在某处指定所需的类型,类型推断才能正常工作。更多 这里.

但是,您可以使用简单的强制转换来消除对变量的需求:

var delayTask = ((Func<Task<double>>) (async () =>
{
    await Task.Delay(3000, cts.Token);
    return (DateTime.Now - start).TotalMilliseconds;
}))();