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

时间:2014-11-19 06:28:39

标签: c# .net asynchronous async-await

我有以下代码:

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;
});

但都会出现编译错误。我错过了什么?

2 个答案:

答案 0 :(得分:4)

我认为您正在寻找的是:

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

答案 1 :(得分:0)

由于无法编译错误的原因,您收到错误:

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

您必须在类型推断的某处指定所需类型才能工作。更多here

但是,您可以通过简单的强制转换删除对变量的需求:

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