Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Task.Factory.StartNew<;TResult>;当TResult是一项任务时<;对象>;_C#_Asynchronous_Async Await_Task Parallel Library - Fatal编程技术网

C# 如何使用Task.Factory.StartNew<;TResult>;当TResult是一项任务时<;对象>;

C# 如何使用Task.Factory.StartNew<;TResult>;当TResult是一项任务时<;对象>;,c#,asynchronous,async-await,task-parallel-library,C#,Asynchronous,Async Await,Task Parallel Library,使用任务并行库调用返回任务的方法时遇到了一些障碍 我有一个名为MspClient的类,它包含一个名为MakeMspCallAsync的异步方法 public class MspClient { public async Task<IMspCallResponse> MakeMspCallAsync(IMspCallRequest request) { var response = new MspCallResponse();

使用任务并行库调用返回任务的方法时遇到了一些障碍

我有一个名为MspClient的类,它包含一个名为MakeMspCallAsync的异步方法

public class MspClient
{        
    public async Task<IMspCallResponse> MakeMspCallAsync(IMspCallRequest request)
    {
        var response = new MspCallResponse();
        ... 
        await ...
        ...
        return response;
    }
}  
公共类MspClient
{        
公共异步任务MakeMspCallAsync(IMspCallRequest请求)
{
var response=新的MspCallResponse();
... 
等待。。。
...
返回响应;
}
}  
在我的使用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);
}
使用(var mspClient=new mspClient())
{
Task[]tasks=新任务[ctx.Message.MspCallRequests.Count];
对于(int i=0;i
编译时异常发生在此行:

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>'
tasks[i]=Task.Factory.StartNew(mspClient.MakeMspCallAsync(mspCallRequest));
错误1“System.Threading.Tasks.TaskFactory.StartNew(System.Func)”的最佳重载方法匹配具有一些无效参数
错误2参数1:无法从“System.Threading.Tasks.Task”转换为“System.Func”

我很确定我忽略了一些非常简单的事情,但我无法理解,有人能帮我吗?谢谢。

您至少需要一名代表:

Task.Factory.StartNew<IMspCallResponse>(() => mspClient.MakeMspCallAsync(mspCallRequest));
您已经得到了答案(使用
Task.Run
而不是
StartNew
,并使用委托),但我必须指出,在多个线程上运行异步方法,然后(同步)阻塞,等待它们完成,这几乎肯定是错误的。如果使用
wait Task.whalll
而不是
Task.WaitAll
,并删除
任务,您的程序可能会运行得更好。请完全运行
tasks[i] = Task.Run(() => mspClient.MakeMspCallAsync(mspCallRequest));