System.Threading.Task Ждать сомнений - PullRequest
0 голосов
/ 01 апреля 2011

Если я использую 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());

1 Ответ

1 голос
/ 01 апреля 2011

Как насчет:

Task.WaitAll(
    Enumerable
        .Range(1, 10)
        .Select(x => Task.Factory.StartNew(arg => 
        {
            // Do the task here
            // arg will obviously be the state object x
            // which will range from 1 to 10
        }, x))
        .ToArray()
);
...