C# 信号集线器中应该使用asyc还是非异步方法?
我在C# 信号集线器中应该使用asyc还是非异步方法?,c#,asp.net-mvc,asp.net-core,async-await,signalr,C#,Asp.net Mvc,Asp.net Core,Async Await,Signalr,我在signal部分中有以下Hub类,在这里我定义了与连接相关的所有方法: public override Task OnConnected() { // here I cannot call this, and need to convert this method async await AddToGroup("stockGroup"); // string name = Context.User.Identity.Name; _connectio
signal
部分中有以下Hub
类,在这里我定义了与连接相关的所有方法:
public override Task OnConnected()
{
// here I cannot call this, and need to convert this method async
await AddToGroup("stockGroup");
//
string name = Context.User.Identity.Name;
_connections.Add(name, Context.ConnectionId);
return base.OnConnected();
}
public async Task AddToGroup(string groupName)
{
await Groups.Add(Context.ConnectionId, groupName);
await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} joined");
}
我看了很多关于这些连接方法(和其他集线器方法)的不同示例,发现其中一些方法使用async
方法,而另一些方法不使用。在上面的示例中,我需要将OnConnected()
方法转换为async
,以便调用AddToGroup()
方法。当然,相反的情况也可以,但我不确定哪一个更好。那么,对于Hub
中的所有方法,我应该使用async
方法还是非异步方法呢?任何帮助都将不胜感激
更新1:转换的方法(异步)
更新2:
public override async Task OnConnected()
{
// #1 There is no async method in "Microsoft.AspNet.SignalR" library.
//await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
// #2 I just have sync version of "AddToGroupAsync()" and used it
await Groups.Add(Context.ConnectionId, "SignalR Users");
/* #3 I think there is no need to use this custom method in the Hub.
Because the same method is already exist in the IGroupManager interface */
//await AddToGroup("jiraGroup");
string name = Context.User.Identity.Name;
_connections.Add(name, Context.ConnectionId);
// #4 Here also the same problem and I used sync version of OnConnected()
//await base.OnConnectedAsync();
await base.OnConnected();
}
只要在方法内部添加
async
(如果需要wait
)<代码>异步是编译器生成异步状态机的标记
我是否应该使用async
-如果需要等待,请使用
如果不需要等待
,只需返回任务本身而不使用异步
。在这种情况下,可以避免创建状态机
另请阅读Stephen Toub:
当您用“async”关键字标记一个方法时,您实际上是在告诉我们
编译器有两件事:
您应该对等待和返回任务使用Async方法 异步是病毒性的,所以您应该避免异步无效 坏的 好 @davidfoll提供了一些很棒的异步指南 更新:删除退货
public override async Task OnConnected()
{
await AddToGroup("stockGroup");
string name = Context.User.Identity.Name;
_connections.Add(name, Context.ConnectionId);
await base.OnConnected();
}
请回答。我认为您描述了如何将方法转换为异步方法。但我需要知道我应该用哪一个。集线器方法中的异步或非异步。为什么?@hexadecimal的主要思想是,您应该返回
Task
,以支持异步执行。如果需要方法中任务的结果,则应同时添加async
和wait
。没有任何限制。很多,投票通过了。你能看一下更新1吗?当我将此方法转换为async时,我遇到了一个问题,因为'HubBase.OnConnected()'是一个返回'Task'的异步方法,return关键字后面不能跟有对象表达式。您是否打算返回“任务”错误。我尝试使用任务等来定义返回类型,但没有固定。有什么想法吗?@hexadecimalwait base.OnConnected()代码>一个重要的问题:当我转换我的方法时,我看到一些类并没有相关调用的异步方法。。。这取决于你需要什么。您是否需要等到执行结束?您指出“我发现集线器中的异步调用有时可能导致无法连接到集线器”,有什么问题?您的用例中有它们吗?如果发生这种情况,在您的用例中是否至关重要?@nilsK对不起,您是对的。我变得干净了一点。这个问题似乎是基于观点的,但由于这是我第一次使用signar,并且在构建我的Hub类时遇到了这个问题,所以我想为一般情况选择最好的选项(在Hub方法中您更喜欢什么?异步还是同步?)。当然这两种方法都是可能的,但是这两种方法的优缺点是什么呢?提前谢谢你…哦,你问错问题了。当您写“因为在web上有一些问题,我看到Hub
中的async
调用有时可能导致无法连接到Hub”时,您应该询问如何解决该问题。如果答案是不使用async
,那么这就是它需要的方式。@LGSon好的,我从问题中删除了这一部分。我现在可以得到你的意见吗?征求意见是在SO。你能看看更新1吗?当我将此方法转换为async时,我遇到了一个问题,因为'HubBase.OnConnected()'是一个返回'Task'的异步方法,return关键字后面不能跟有对象表达式。您是否打算返回“任务”错误。我尝试使用任务等来定义返回类型,但没有固定。有什么想法吗?只需返回任务并使用等待。这个方法不需要task是的,我想是的,但仍然是相同的错误,如果我不使用return,错误就消失了(“return关键字后面不能跟对象表达式”)。但是,我需要返回base.OnConnected()。有什么想法吗?public override async Task OnConnected(){await AddToGroup(“stockGroup”);string name=Context.User.Identity.name;_connections.Add(name,Context.ConnectionId);base.OnConnected();}非常感谢您和@mtkachenko的帮助<代码>等待base.OnConnected()代码>修复了该问题(也如mtkachenko所说添加)。正如mtkachenko首先发布的帖子一样,我在他的答案上做了标记:)但当然,我对你们的两个问题都投了赞成票。当做
public async void MethodAsync()
{
var result = await SendAsync();
DoSomething(result);
}
public async Task MethodAsync()
{
var result = await SendAsync();
DoSomething(result);
}
public override async Task OnConnected()
{
await AddToGroup("stockGroup");
string name = Context.User.Identity.Name;
_connections.Add(name, Context.ConnectionId);
await base.OnConnected();
}