2017-12-06 4 views
0

비동기 메서드가있는 "비동기 Func <"을 가지고 있습니다. 나는 아래의 코드처럼 TaskFactory.StartNew를 사용하여> 그 Func을 <에 평행 전화를 많이 만들고 싶어,하지만 난 따라와 오류 얻을 :비동기 메서드를 사용하여 TaskFactory.StartNew <Task<Result>을 어떻게 사용할 수 있습니까?

error converting 'System.Threading.Tasks.Task<System.Threading.Tasks.Task<Result>>' to 'System.Threading.Tasks.Task<Result>'

가 어떻게이 비동기 방식의 병렬 통화를 할 수 있습니다?

+2

로 단순화 할 수있는 특별한 작업 공장을 사용하지 않는 경우. 당신은 아마 그것을 전혀 필요로하지 않을 것입니다. 동기 사전 작업이있는 경우,'Task.Run()'을 사용하십시오. – SLaks

+0

또한 ForEach()가 아닌'Select()'를 사용하십시오. – SLaks

+0

호세 알론소 (José Alonso), 내 편집이 오류를 일으키는 라인에서 정확히 가리키는 지 확인하십시오. –

답변

4

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(). 
+0

안녕 스콧, 도움을 주셔서 감사합니다. 너의 충고를 사용했다. –