如何将 TaskFactory.StartNew<Task<Result>> 与异步方法一起使用?
How can I use TaskFactory.StartNew<Task<Result>> with async methods?
我有一个异步 Func<>,其中我 "await" 用于异步方法。我想使用 TaskFactory.StartNew 对该 Func<> 进行大量并行调用,如下面的代码,但出现以下错误:
error converting 'System.Threading.Tasks.Task<System.Threading.Tasks.Task<Result>>'
to 'System.Threading.Tasks.Task<Result>'
如何并行调用异步方法?
Func<object, Task<Result>> action = async (object m) =>
{
try
{
return await Send<Message, Result>(m as Message);
}
catch (Exception exc)
{
Result result = new Result();
(result as ResponseBaseDto).Success = false;
(result as ResponseBaseDto).ErrorList = new List<Entities.Common.ErrorDto>()
{
new Entities.Common.ErrorDto{ Code = 9999, Message = exc.Message }
};
return result;
}
};
// Error on request.ForEach
request.ForEach(r => sending.Add(taskFactory.StartNew<Task<Result>>(action, r)));
var tareas = sending.ToArray();
await Task.WhenAll(tareas);
return tareas.Select(s => s.Result).ToList();
假设你使用的是 taskFactory.StartNew(
而不是 Task.Run(
因为你有一个特殊配置的 TaskFactory
你需要使用最简单的解决方案是使用 .Unwrap()
扩展解包嵌套任务的方法。
您还应该将 .ForEach(r=> sending.Add(
替换为 .Select(r =>
语句以减少列表迭代的次数。如果您要返回 IEnumerable<Result>
而不是 List<Result>
,您也可以删除最后的 .ToList()
。
var tareas = request.Select(r => taskFactory.StartNew<Task<Result>>(action, r).Unwrap());
var results = await Task.WhenAll(tareas); //results is a `Result[]`
return results.ToList(); // you may not need this .ToList().
如果您不使用特殊任务工厂,您的代码可以简化为
var tareas = request.Select(r => Task.Run(() => action(r)));
var results = await Task.WhenAll(tareas); //results is a `Result[]`
return results.ToList(); // you may not need this .ToList().
我有一个异步 Func<>,其中我 "await" 用于异步方法。我想使用 TaskFactory.StartNew 对该 Func<> 进行大量并行调用,如下面的代码,但出现以下错误:
error converting
'System.Threading.Tasks.Task<System.Threading.Tasks.Task<Result>>'
to'System.Threading.Tasks.Task<Result>'
如何并行调用异步方法?
Func<object, Task<Result>> action = async (object m) =>
{
try
{
return await Send<Message, Result>(m as Message);
}
catch (Exception exc)
{
Result result = new Result();
(result as ResponseBaseDto).Success = false;
(result as ResponseBaseDto).ErrorList = new List<Entities.Common.ErrorDto>()
{
new Entities.Common.ErrorDto{ Code = 9999, Message = exc.Message }
};
return result;
}
};
// Error on request.ForEach
request.ForEach(r => sending.Add(taskFactory.StartNew<Task<Result>>(action, r)));
var tareas = sending.ToArray();
await Task.WhenAll(tareas);
return tareas.Select(s => s.Result).ToList();
假设你使用的是 taskFactory.StartNew(
而不是 Task.Run(
因为你有一个特殊配置的 TaskFactory
你需要使用最简单的解决方案是使用 .Unwrap()
扩展解包嵌套任务的方法。
您还应该将 .ForEach(r=> sending.Add(
替换为 .Select(r =>
语句以减少列表迭代的次数。如果您要返回 IEnumerable<Result>
而不是 List<Result>
,您也可以删除最后的 .ToList()
。
var tareas = request.Select(r => taskFactory.StartNew<Task<Result>>(action, r).Unwrap());
var results = await Task.WhenAll(tareas); //results is a `Result[]`
return results.ToList(); // you may not need this .ToList().
如果您不使用特殊任务工厂,您的代码可以简化为
var tareas = request.Select(r => Task.Run(() => action(r)));
var results = await Task.WhenAll(tareas); //results is a `Result[]`
return results.ToList(); // you may not need this .ToList().