当 TResult 是任务 <object> 时如何使用 Task.Factory.StartNew<TResult>
How to use Task.Factory.StartNew<TResult> when TResult is a Task<object>
运行 使用任务并行库调用 returns 任务的方法有点障碍。
我有一个名为 MspClient 的 class,它包含一个名为 MakeMspCallAsync
的异步方法
public class MspClient
{
public async Task<IMspCallResponse> MakeMspCallAsync(IMspCallRequest request)
{
var response = new MspCallResponse();
...
await ...
...
return response;
}
}
在我使用 MspClient class 的程序中,我想按照以下几行写一些东西:
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));
不过这会return一个Task<Task<IMspCallResponse>>
,有点笨拙。您将需要打开它(参见 TaskExtensions.Unwrap
)。 Task.Run
更好,因为它会为您做到这一点:
tasks[i] = Task.Run(() => mspClient.MakeMspCallAsync(mspCallRequest));
运行 使用任务并行库调用 returns 任务的方法有点障碍。
我有一个名为 MspClient 的 class,它包含一个名为 MakeMspCallAsync
的异步方法public class MspClient
{
public async Task<IMspCallResponse> MakeMspCallAsync(IMspCallRequest request)
{
var response = new MspCallResponse();
...
await ...
...
return response;
}
}
在我使用 MspClient class 的程序中,我想按照以下几行写一些东西:
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));
不过这会return一个Task<Task<IMspCallResponse>>
,有点笨拙。您将需要打开它(参见 TaskExtensions.Unwrap
)。 Task.Run
更好,因为它会为您做到这一点:
tasks[i] = Task.Run(() => mspClient.MakeMspCallAsync(mspCallRequest));