2017-12-06 20 views
0

私は非同期メソッドのために "待っている"非同期Func <を持っています。私は以下のコードのようなTaskFactory.StartNewを使用しているのFunc <に平行呼び出し>、をたくさん作りたいが、私はfollowinエラーが表示されます。TaskFactory.StartNew <Task<Result>を非同期メソッドで使用するにはどうすればよいですか?

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

は、どのように私は非同期メソッドの並列呼び出しを持つことができますか?あなたはeasistソリューションを使用する必要が特別に構成TaskFactoryは、ネストされたタスクをアンラップする.Unwrap()拡張メソッドを使用している持っているので、あなたがtaskFactory.StartNew(代わりのTask.Run(を使用していると仮定すると、

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(); 

+2

に単純化することができる特殊なタスクファクトリを使用していない場合。あなたはおそらくそれを必要としません。同期前の ''仕事 'がある場合は、 'Task.Run()'を使います。 – SLaks

+0

また、 'ForEach()'ではなく 'Select()'を使用してください。 – SLaks

+0

JoséAlonso、私の編集がエラーの原因となる行を正しく指していることを確認してください。 –

答えて

4

また、.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

Hello Scott、 ご協力いただきありがとうございます。あなたのアドバイスを使用しました –

関連する問題