如何使用Task.Factory.StartNew< result >当result是一个task对象时
本文关键字:result 一个 对象 task Factory Task 何使用 StartNew | 更新日期: 2023-09-27 18:03:02
使用任务并行库调用返回任务的方法遇到了一点障碍。
我有一个名为MspClient的类,其中包含一个名为MakeMspCallAsync的异步方法
public class MspClient
{
public async Task<IMspCallResponse> MakeMspCallAsync(IMspCallRequest request)
{
var response = new MspCallResponse();
...
await ...
...
return response;
}
}
在我使用MspClient类的程序中,我想按照以下行写一些东西:
using (var mspClient = new MspClient())
{
Task<IMspCallResponse>[] tasks = new Task<IMspCallResponse>[ctx.Message.MspCallRequests.Count];
for(int i = 0; i < ctx.Message.MspCallRequests.Count; i++)
{
var mspCallRequest = ctx.Message.MspCallRequests[i];
tasks[i] = Task.Factory.StartNew<IMspCallResponse>(mspClient.MakeMspCallAsync(mspCallRequest));
}
Task.WaitAll(tasks);
}
编译时异常发生在这一行:
tasks[i] = Task.Factory.StartNew<IMspCallResponse>(mspClient.MakeMspCallAsync(mspCallRequest));
Error 1 The best overloaded method match for 'System.Threading.Tasks.TaskFactory.StartNew<IMspCallResponse>(System.Func<IMspCallResponse>)' has some invalid arguments
Error 2 Argument 1: cannot convert from 'System.Threading.Tasks.Task<IMspCallResponse>' to 'System.Func<IMspCallResponse>'
我很确定我忽略了一些非常简单的事情,但我不能把我的头围绕它,有人能帮我吗?谢谢。
你至少需要一个委托:
Task.Factory.StartNew<IMspCallResponse>(() => mspClient.MakeMspCallAsync(mspCallRequest));
但是,这将返回一个Task<Task<IMspCallResponse>>
,这有点不方便。您需要打开它(参见TaskExtensions.Unwrap
)。Task.Run
更好,因为它会为你做:
tasks[i] = Task.Run(() => mspClient.MakeMspCallAsync(mspCallRequest));