Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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#client中并发处理多个事件_C#_Signalr_Signalr.client - Fatal编程技术网

如何在C#client中并发处理多个事件

如何在C#client中并发处理多个事件,c#,signalr,signalr.client,C#,Signalr,Signalr.client,我有一个用C#编写的signar客户端应用程序,它从中心订阅事件。当事件被“激发”时,应用程序执行一个方法 问题是,对于该客户机,所有此类事件都是按顺序处理的 用例/流程: myHub.On<ExecuteRequestModel, string>("Execute", (request, to) => { logger.Info("Execute request received for connectionID: " + connection.ConnectionI

我有一个用C#编写的signar客户端应用程序,它从中心订阅事件。当事件被“激发”时,应用程序执行一个方法

问题是,对于该客户机,所有此类事件都是按顺序处理的

用例/流程:

myHub.On<ExecuteRequestModel, string>("Execute", (request, to) =>
{
    logger.Info("Execute request received for connectionID: " + connection.ConnectionId);

    myMethod();

    myHub.Invoke("ExecuteResult", response, to);

    logger.Info("Execute request processed");
    logger.Info("...");
});
  • 在浏览器中,用户单击按钮
  • 该按钮触发对信号器集线器的呼叫
  • 信令集线器将消息发送到特定的信令客户端
  • 信号器客户端接收事件/消息
  • SignalR客户端调用将消息存储在数据库中的方法
  • 信号器客户端调用中心中的方法以返回结果
  • 中心向用户交付结果
  • 如果另一个用户同时单击该按钮,则信号器客户端一次只存储一条消息

    客户端示例:

    myHub.On<ExecuteRequestModel, string>("Execute", (request, to) =>
    {
        logger.Info("Execute request received for connectionID: " + connection.ConnectionId);
    
        myMethod();
    
        myHub.Invoke("ExecuteResult", response, to);
    
        logger.Info("Execute request processed");
        logger.Info("...");
    });
    
    myHub.On(“执行”(请求,收件人)=>
    {
    logger.Info(“执行接收到的连接ID请求:+connection.connectionID”);
    myMethod();
    调用(“executesult”,响应,to);
    logger.Info(“执行已处理的请求”);
    logger.Info(“…”);
    });
    

    有什么推荐做法可以同时处理多个事件吗?

    可以使用Async/Await解决。异步函数将负责向集线器回复结果

    myHub.On<ExecuteRequestModel, string>("Execute", async (request, to) => 
        await onExecute(request, to)
    );
    
    myHub.On(“执行”),异步(请求,到)=>
    等待OneExecute(请求,发送至)
    );
    
    您能再详细说明一下吗……也许可以用一个示例场景?您好@Hackerman。问题已更新。你能看一下吗?也许可以使用
    任务。运行它,但我不确定你是否可以从不同的线程返回响应。我想知道这个设计。为什么web应用程序(Hub)应该通过信号器与数据库层通信,而不使用web服务或类似的东西。可能相关:请注意,基本上不需要做任何事情来获得并发性,您可能只担心您的共享状态