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
를 구성 당신이 easist 솔루션을 사용할 필요가 있기 때문에 당신이
taskFactory.StartNew(
대신
Task.Run(
의를 사용하는 가정은 중첩 된 작업을 풀다하기 위해
.Unwrap()
확장 방법을 사용합니다.
목록을 반복하는 횟수를 줄이려면 .ForEach(r=> sending.Add(
을 .Select(r =>
문으로 대체해야합니다. List<Result>
대신 IEnumerable<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().
로 단순화 할 수있는 특별한 작업 공장을 사용하지 않는 경우. 당신은 아마 그것을 전혀 필요로하지 않을 것입니다. 동기 사전 작업이있는 경우,'Task.Run()'을 사용하십시오. – SLaks
또한 ForEach()가 아닌'Select()'를 사용하십시오. – SLaks
호세 알론소 (José Alonso), 내 편집이 오류를 일으키는 라인에서 정확히 가리키는 지 확인하십시오. –