返回使用另一个异步函数的异步任务

时间:2013-12-24 10:48:23

标签: c# task .net-4.5 async-await

我正在尝试在使用异步功能的函数中返回Task paremeter并遇到麻烦。

这是我的代码:

 private async Task<int> GetIntAsync()
 {
   return Task<int>.Factory.StartNew(async () =>
   {
       await func();

       some code..

       return 123;
   });

 }

我收到错误:“无法将异步lambda表达式转换为委托类型”..

有没有办法从新任务中调用async functnion?

3 个答案:

答案 0 :(得分:11)

您几乎肯定不想致电Task.Factory.StartNewTask.Run。相反,只需使用asyncawait

private async Task<int> GetIntAsync()
{
   await func();

   some code..

   return 123;
}

有关详细信息,请参阅我的async intro博文。

答案 1 :(得分:4)

我想展示如何纠正初始语法以解决编译器错误,并保持GetIntAsync方法的相同签名:

private async Task<int> GetIntAsync()
{
    return await Task.Factory.StartNew(async () =>
    {
        await Task.Delay(42);
        return 123;
    }).Unwrap();
}

这是相同的代码,更明确的输入,所以你可以更好地了解正在发生的事情:

private async Task<int> GetIntAsync()
{
    Func<Task<int>> lambda = async () =>
    {
        await Task.Delay(42);
        return 123;
    };

    Task<Task<int>> outerTask = Task.Factory.StartNew(lambda);

    Task<int> innerTask = outerTask.Unwrap();

    return await innerTask;
}

实际上,这种方法并不复杂,而且这里有一个冗余的await。 @ user2720372的answer建议使用Task.Run创建任务的正确方式。

答案 2 :(得分:3)

如果您想从方法中返回Task<int>,则无法将其声明为async,因为您没有等待其中的任何内容(您只在内部Task等待) :

private Task<int> GetIntAsync()
{
    return Task.Run(async () =>
        {
            await Task.Delay(1000);
            return 123;
        });
}

或等待,返回类型应为Task<Task<int>>

private async Task<Task<int>> MyMethod()
{
   await Task.Delay(1000);

   return Task.Run(async () =>
   {
        await Task.Delay(1000);
        return 123;
   });
}