【发布时间】:2022-02-04 05:38:24
【问题描述】:
我制作了一个运行良好的事件系统,它允许我通过传递事件类型和处理程序来注册事件处理程序,这是一个动作,例如
EventManager.RegisterEventHandler<Events.NewCompleteSample>(HandleCompleteSample);
打电话
public static void RegisterEventHandler<T>(Action<T> handlerAction)
稍后引发事件时,我调用已注册的操作。
我的问题是我随机发生了静默崩溃,我现在意识到这可能是因为我调用的操作可能(通常是)异步方法,而我知道未捕获到非等待异步方法中的异常为时已晚任何地方。
解决方案似乎是等待处理程序
await handler.Invoke(arguments)
但由于我不知道如何指定 Actions 是异步方法,所以这不起作用。
有没有办法将 Action 定义为异步,以便以后调用它时可以等待它,或者是否有更聪明的解决方案来解决这个问题?
【问题讨论】:
-
是的,异步操作是
Func<Task> -
“异步函数”是真正的“可等待函数”的一个非常常见的术语。如果您以那样的方式考虑它,它会更有意义。
async关键字与编译器为您创建的异步状态机有关,但您不需要它来等待某些东西。 -
感谢@Fabio,这很快并且似乎在测试中有效。将进行实验。
-
它是等待的,因为它遵循一个模式。
Task和Task<T>,以及ValueTask和ValueTask<T>都遵循该模式,使其可等待,因此您可以使用await关键字。并非所有可等待函数都具有async关键字,因为它们不需要编译器将方法重写为状态机。有时,他们只是return Task.Completed;。这不需要状态机,但它仍然可以等待。 -
可能相关问题:How do I await events in C#?
标签: c# async-await