异步处理程序signalr .NET客户端核心

问题描述 投票:4回答:1

对于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)。我可以与自己的签名扩展方法,但是当它不存在着,我在想,我可能会错过一些重要的事情了么?

signalr.client
1个回答
1
投票

async void方法的问题是,他们可能会崩溃您的应用程序,如果有未处理的异常。阅读herehere

这些文章说,async void被允许的,因为事件的唯一的,这些都是我们谈论事件。但它仍然是真实的异常可能会崩溃您的整个应用程序。所以,如果你要它,请确保您有try / catch块任何地方的异常可能被抛出(但仍,例外可能发生的catch块中,当您尝试登录的话)。

async void方法也可能会导致意外的行为,因为调用它的代码是不是等待它才去关闭和做别的事情完成。

请记住,await的好处是,ASP.NET可以熄灭,做些别的事情,回来到代码的其余部分之后。通常,这是很好的。但是,在这种特殊情况下,也可以是指两个(或更多)收到的消息可在同一时间得到处理,这是一个折腾了哪些完成第一(即完得到处理的第一个可能不是排在第一位)。尽管这可能和你的情况可能并不重要。

你可能会更好只是使其同步,并且等待的东西,你不能同步:

connection.On<SomeEvent>("HubMethodName", HandleHubMethodName);
private void HandleHubMethodName(ev) {
    SomeAwaitableThing().GetAwaiter().GetResult();
}

herehere使用.GetAwaiter().GetResult()而不是.Wait()的利益。

© www.soinside.com 2019 - 2024. All rights reserved.