我正在尝试在使用异步功能的函数中返回Task paremeter并遇到麻烦。
这是我的代码:
private async Task<int> GetIntAsync()
{
return Task<int>.Factory.StartNew(async () =>
{
await func();
some code..
return 123;
});
}
我收到错误:“无法将异步lambda表达式转换为委托类型”..
有没有办法从新任务中调用async functnion?
答案 0 :(得分:11)
您几乎肯定不想致电Task.Factory.StartNew
或Task.Run
。相反,只需使用async
和await
:
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;
});
}