Как запустить несколько потоков и ожидать завершения всех из них - PullRequest
4 голосов
/ 26 марта 2012

Я хочу написать метод, который запускает несколько потоков, и хочу, чтобы до завершения моего метода я был уверен, что все они завершены с использованием async/await. как я могу это сделать?

пожалуйста, примите во внимание этот псевдокод:

private async void SomeWork()
{
    var a = doWork1();
    var b = doWork2();
    var c = doWork3();
    var d = doWork4();
    ...
    //I want to assure that all of above thread are complete using `C#-5` new features   
}

Как я могу это сделать?

Ответы [ 2 ]

8 голосов
/ 26 марта 2012

Способ async состоит в том, чтобы ваш метод возвращал Task, и вызывающая сторона этого метода затем await (или Wait()) его.Ваш метод может выглядеть так:

private async Task SomeWork()
{
    var a = doWork1();
    var b = doWork2();
    var c = doWork3();
    var d = doWork4();
    ...
    await Task.WhenAll(a, b, c, d);
}
7 голосов
/ 26 марта 2012

Ваше требование не соответствует вашему примеру кода: вы отметили свой метод async, что означает, что вы хотите, чтобы этот метод мог возвращать до того, как завершит свою работу. Тем не менее, вы говорите, что хотите, чтобы он возвращал только после всей работы.

Таким образом, если вы хотите, чтобы ваш метод был синхронным , не используйте async и вручную дождитесь завершения всех задач:

private void SomeWork()
{
    var a = doWork1();
    var b = doWork2();
    var c = doWork3();
    var d = doWork4();
    ...
    a.Wait();
    b.Wait();
    c.Wait();
    d.Wait();
}

или, более элегантно:

    Task.WaitAll(a, b, c, d);
...