2016-01-14 4 views
1

Уместно ли использовать метод async void для начала долгой жизни? Я знаю Nito или Task.Run() Может использоваться для использования Task не по-асинхронному. В чем разница? Есть ли подводные камни?Использование метода async void для запуска долгоживущей операции

Судя по всему, что я имею в виду, я могу написать так:

async void bar() 
{ 
    try 
    { 
     //... 
    } 
    catch (Exception ex) 
    { 
     // no rethrowing here 
    } 
} 

void foo() 
{ 
    bar(); 
    // will continue right after 1st await in bar() 
    baz(); 
} 
+0

Почему бы не «async Task» и просто не ждать бар? –

+0

@ScottChamberlain Но будет ли он запускаться асинхронно, если не ожидается позже в коде? – ilivit

+0

Выполнение async void и выполнение async Задача без ожидания возвращенной задачи имеет такое же поведение. вызов ожидания не запускает задачу, он ждет завершения уже начатой ​​задачи. Вот почему, если вы вызываете ожидание задачи, которая была запущена с помощью 'new Task()' и никогда не вызывала '.Start()', ожидание будет ждать вечно, потому что задача не запущена. –

ответ

2

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

В вашем фрагменте кода комментарий will continue right after 1st await in bar не обязательно правильный. Поскольку он bar будет синхронно исполнять и блокировать foo, потому что bar не ждет в нем.

Запуск долговременной операции требует либо использования async IO, либо каким-либо образом использовать новый поток/задачу (Task.Run).

+0

+1 Я помню комментарий Стивена Тууба о async/await: «ни одно ключевое слово в C# не запускает поток - должен быть какой-то вызов API (Task.Run(), File.ReadAsync() ....) – alexm

Смежные вопросы