Catch an exception thrown by an async void method

前端 未结 6 1488
北恋
北恋 2020-11-22 11:20

Using the async CTP from Microsoft for .NET, is it possible to catch an exception thrown by an async method in the calling method?

public async void Foo()
{
         


        
6条回答
  •  情歌与酒
    2020-11-22 11:51

    It's somewhat weird to read but yes, the exception will bubble up to the calling code - but only if you await or Wait() the call to Foo.

    public async Task Foo()
    {
        var x = await DoSomethingAsync();
    }
    
    public async void DoFoo()
    {
        try
        {
            await Foo();
        }
        catch (ProtocolException ex)
        {
              // The exception will be caught because you've awaited
              // the call in an async method.
        }
    }
    
    //or//
    
    public void DoFoo()
    {
        try
        {
            Foo().Wait();
        }
        catch (ProtocolException ex)
        {
              /* The exception will be caught because you've
                 waited for the completion of the call. */
        }
    } 
    

    Async void methods have different error-handling semantics. When an exception is thrown out of an async Task or async Task method, that exception is captured and placed on the Task object. With async void methods, there is no Task object, so any exceptions thrown out of an async void method will be raised directly on the SynchronizationContext that was active when the async void method started. - https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

    Note that using Wait() may cause your application to block, if .Net decides to execute your method synchronously.

    This explanation http://www.interact-sw.co.uk/iangblog/2010/11/01/csharp5-async-exceptions is pretty good - it discusses the steps the compiler takes to achieve this magic.

提交回复
热议问题