如何使用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< result >当result是一个task对象时

你至少需要一个委托:

Task.Factory.StartNew<IMspCallResponse>(() => mspClient.MakeMspCallAsync(mspCallRequest));

但是,这将返回一个Task<Task<IMspCallResponse>>,这有点不方便。您需要打开它(参见TaskExtensions.Unwrap)。Task.Run更好,因为它会为你做:

tasks[i] = Task.Run(() => mspClient.MakeMspCallAsync(mspCallRequest));