系统反射.Invoke()无法捕获异步调用方法内的预期

时间:2018-02-11 11:21:25

标签: c# .net asynchronous system.reflection

我没有成功调用异步void方法并从该方法中捕获异常。没有异步工作的空洞就好了。我真的希望有一个解决方案。下面是一些例子:

class Test
{
    public static void InvokeMethod()
    {
        try
        {
            typeof(testmethods).GetMethod("TestMethod").Invoke(null, null);
            typeof(testmethods).GetMethod("TestAsyncMethod").Invoke(null, null); 
            //This one throws an exception but doesent catch it.
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.InnerException);
        }
    }
}

public class testmethods
{
    public static void TestMethod()
    {
        throw new Exception("Test");
    }

    public static async void TestAsyncMethod()
    {
        throw new Exception("TestAsync");
    }
}

如果您有一些不错的选择,请随时推荐

1 个答案:

答案 0 :(得分:2)

文章Async/Await - Best Practices in Asynchronous Programming很好地解释了您的方案以及无法捕获异常的原因。

  

Async void方法具有不同的错误处理语义。当异步任务或异步任务方法抛出异常时,将捕获该异常并将其放在Task对象上。使用async void方法时,没有Task对象,因此异步void方法抛出的任何异常都将直接在async void方法启动时处于活动状态的SynchronizationContext上引发。

简而言之:考虑将async void更改为async TaskAsync void仅建议用于事件处理程序。