gpt4 book ai didi

signalr.client - 信号器 .net 核心客户端中的异步处理程序

转载 作者:行者123 更新时间:2023-12-03 14:49:44 24 4
gpt4 key购买 nike

信号器的 .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 的问题方法是,如果存在未处理的异常,它们可能会使您的应用程序崩溃。阅读 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() .

关于signalr.client - 信号器 .net 核心客户端中的异步处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50757408/

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