我没有成功调用异步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");
}
}
如果您有一些不错的选择,请随时推荐
答案 0 :(得分:2)
文章Async/Await - Best Practices in Asynchronous Programming很好地解释了您的方案以及无法捕获异常的原因。
Async void方法具有不同的错误处理语义。当异步任务或异步任务方法抛出异常时,将捕获该异常并将其放在Task对象上。使用async void方法时,没有Task对象,因此异步void方法抛出的任何异常都将直接在async void方法启动时处于活动状态的SynchronizationContext上引发。
简而言之:考虑将async void
更改为async Task
。 Async void
仅建议用于事件处理程序。