我在尝试找出我的错误,但是需要额外的帮助。我想创建一个工作服务,可以将工作操作委托分配给它。当我尝试捕获由工作操作委托抛出的异常时,处理程序没有被调用。我认为这是因为我的操作实际上是一个返回Task的异步方法,并且它没有被等待。但是我怎么知道委托是异步的呢?为什么C#允许我将返回Task的方法分配给应该返回void的action变量?如果您能提供任何帮助,我将不胜感激!
[Fact]
public async Task CanCatchExceptions() {
var worker = new Worker {
WorkAction = async item => await Throws()
};
worker.DoWork(new WorkItem { Id = 1 });
}
public class Worker {
// would prefer to keep work action simple and not require a Task.
public Action<WorkItem> WorkAction { get; set; }
public void DoWork(WorkItem item) {
try {
WorkAction(item);
} catch {
Debug.WriteLine("Handled");
}
}
}
public class WorkItem {
public int Id { get; set; }
}
public async Task Throws() {
throw new ApplicationException();
}
async Task
等同于async void
,这就是在您的情况下发生的事情,从而允许使用lambda表达式作为Action<WorkItem>
委托类型。但请注意,此转换不会更改async
方法的行为;它仍然在第一个await
语句处返回,因此除非等待(如果是void
,则无法等待),否则调用者可以(通常)在async
方法之前完成。 - Peter Duniho