Если я использую System.Threading.Task
для запуска параллельных задач, таких как:
Func<MyResult> func=ComputeResult;
var t = Task.Facroty.StartNew<MyResult>(ComputeResult, 1);//1 is some id
t.Wait();
var tt = Task.Facroty.StartNew<MyResult>(ComputeResult, 2);
tt.Wait();
Будет t.Wait()
блокировать следующий оператор.
Если я запускаю несколько задач в цикле и хочу ждать их всех таким образом, чтобы задачи внутри цикла не блокировали друг друга, а оператор после цикла блокировался.
Я использую следующую конструкцию:
var tasks=new List<Task<MyResult>>();
Func<MyResult> func=ComputeResult;
for(int i=0; i<10;i++)
{
var t=Task.Facroty.StartNew<MyResult>(ComputeResult, i);
tasks.Add(t);
//t.Wait(); //SHOULD I CALL WAIT HERE?
}
//OR THIS BETTER OR EVEN IF THIS WORKS
foreach(var t in tasks)
{
t.Wait();
}
//do other stuff
РЕДАКТИРОВАТЬ: - В окончательной форме я использую следующую строку вместо последнего foreach
цикла.
Task.WaitAll(tasks.ToArray());