gpt4 book ai didi

c# - 使用异步委托(delegate)进行异常处理

转载 作者:行者123 更新时间:2023-11-30 14:54:36 24 4
gpt4 key购买 nike

我想弄清楚我在这里做错了什么。我敢肯定这是愚蠢的事情,但我可以用一些额外的眼睛来弄清楚它是什么。我正在尝试创建一个工作人员服务,您可以向其分配工作操作委托(delegate)。当我 try catch 工作操作委托(delegate)抛出的异常时,不会调用处理程序。我认为这是因为我的操作实际上是一个返回 Task 的异步方法,并且没有等待它。但是我怎么知道委托(delegate)是异步的呢?为什么 C# 让我将返回 Task 的方法分配给应该返回 void 的操作变量?

如有任何帮助,我们将不胜感激!

[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();
}

最佳答案

没有返回值的 Lambda 可以转换为返回任务的方法(例如 Func<Task> )或返回 void 的方法(例如 Action )。请注意,当转换为返回 void 的方法时,该 lambda 的实际方法是 async void。方法,伴随着所有问题 async void方法。我描述了async void的一些问题在我的 best practices article ;其中之一是您无法使用 try 捕获异常.

最好的选择是更改您的工作项以返回 Task ,这是异步方法更自然的表示。

关于c# - 使用异步委托(delegate)进行异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27195044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com