对于signalr的.NET核心客户有可能以下列方式使用的HubConnection
类。
HubConnection connection = new HubConnectionBuilder()
.WithUrl("https://localhost:44321/hub")
.Build();
await connection.StartAsync();
connection.On<SomeEvent>("HubMethodName", (ev) => Console.WriteLine("EventHandler"))
我想这样做在事件处理一些异步工作,但它不会立即明显对我怎么样,因为大多数重载厚望的Action
。使用async void
工作,但我不知道这是一个好主意。此外,还有与被看好的签名On(string methodName, Type[] parameters, Func<object[], Task>) handler)
过载,但我想我本来期望一个与On<T>(string methodName, Func<T, Task> handler)
。我可以与自己的签名扩展方法,但是当它不存在着,我在想,我可能会错过一些重要的事情了么?
与async void
方法的问题是,他们可能会崩溃您的应用程序,如果有未处理的异常。阅读here和here。
这些文章说,async void
被允许的,因为事件的唯一的,这些都是我们谈论事件。但它仍然是真实的异常可能会崩溃您的整个应用程序。所以,如果你要它,请确保您有try
/ catch
块任何地方的异常可能被抛出(但仍,例外可能发生的catch
块中,当您尝试登录的话)。
但async void
方法也可能会导致意外的行为,因为调用它的代码是不是等待它才去关闭和做别的事情完成。
请记住,await
的好处是,ASP.NET可以熄灭,做些别的事情,回来到代码的其余部分之后。通常,这是很好的。但是,在这种特殊情况下,也可以是指两个(或更多)收到的消息可在同一时间得到处理,这是一个折腾了哪些完成第一(即完得到处理的第一个可能不是排在第一位)。尽管这可能和你的情况可能并不重要。
你可能会更好只是使其同步,并且等待的东西,你不能同步:
connection.On<SomeEvent>("HubMethodName", HandleHubMethodName);
private void HandleHubMethodName(ev) {
SomeAwaitableThing().GetAwaiter().GetResult();
}