2015-10-26 8 views
0

Я в настоящее время вызываю метод async и не хочу await. Мне не нужен результат для метода async и я не хочу блокировать его во время ввода-вывода. Однако, если есть ошибка, возникшая в методе async, я хотел бы указать catch. До сих пор у меня есть:Вызов метода async без ожидания

public static void main() { 
    MyAsyncMethod(). 
    ContinueWith(t => Console.WriteLine(t.Exception), 
      TaskContinuationOptions.OnlyOnFaulted); 
    //dostuff without waiting for result 
} 

Это не отлов исключения, брошенный в MyAyncMethod от Main. Есть ли что-то, что я делаю неправильно?

+0

Нет блока try-catch ...? – Tim

+0

Если это не «исключение», что происходит? – i3arnon

+0

Я предположил, что Continuewith «поймает» исключение. По крайней мере, это то, что я читал, но в настоящее время мой код падает – user3750474

ответ

1

async-wait и ContinueWith может работать, но он полон головных болей. Намного проще реорганизовать обработку ошибок в метод и поместить его туда, тогда вы можете просто вызвать этот новый метод из своего основного метода.

public static void main() { 
    var task = DoMyAsyncMethod(); 

    //dostuff without waiting for result 

    //Do a wait at the end to prevent the program from closing before the background work completes. 
    task.Wait(); 

} 

private static async Task DoMyAsyncMethod() 
{ 
    try 
    { 
     await MyAsyncMethod(); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
    } 
} 

Я подозреваю, что реальная проблема, которую вы имеете дело с тем недостающим Wait() и ваша программа закрывает себя перед вашей фоновой работы выполняется обработка.

+0

Наша программа всегда будет работать на сервере, поэтому мы никогда не будем ждать. Не будет ли это блокироваться в DoMyAsyncMethod? – user3750474

+0

Нет, когда вы нажмете 'await', функция' DoMyAsyncMethod' вернет объект 'Task', он не будет блокироваться. Вам решать, что вы хотите сделать с этой «Задачей», подождать, выбросить, это не имеет значения. «Ожидание» - это просто более простой способ работать с 'ContinueWith', он позволяет вам писать асинхронный код так же, как вы пишете код синхронизации (например, используя try/catch вместо' ContinueWith (SomeMethod, TaskContinuationOptions .OnlyOnFaulted) '). –

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