繁体   English   中英

如何使用Task.Factory.StartNew <TResult> 当TResult是一个任务时 <object>

[英]How to use Task.Factory.StartNew<TResult> when TResult is a Task<object>

使用“任务并行库”调用返回“任务”的方法时遇到一点障碍。

我有一个名为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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM