Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 信号集线器中应该使用asyc还是非异步方法?_C#_Asp.net Mvc_Asp.net Core_Async Await_Signalr - Fatal编程技术网

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”关键字标记一个方法时,您实际上是在告诉我们 编译器有两件事:

  • 您告诉编译器您希望能够使用 方法中的“await”关键字(如果 并且仅当其所在的方法或lambda标记为async时)。在做 因此,您告诉编译器使用状态来编译该方法 机器,这样该方法将能够挂起然后恢复 在等待点异步

  • 你在告诉编译器“提升” 方法的结果或可能发生在方法中的任何异常 返回类型。对于返回Task或Task的方法 表示在中未处理的任何返回值或异常 该方法存储在结果任务中。对于返回 void,这意味着任何异常都会传播到调用方的 通过当时的“SynchronizationContext”创建上下文 方法的初始调用


  • 您应该对等待和返回任务使用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关键字后面不能跟有对象表达式。您是否打算返回“任务”错误。我尝试使用任务等来定义返回类型,但没有固定。有什么想法吗?@hexadecimal
    wait 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();
    }