【问题标题】:How to handle multiple events concurrently in C# client如何在 C# 客户端中同时处理多个事件
【发布时间】:2017-01-11 17:29:27
【问题描述】:

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

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

用例/流程:

  1. 在浏览器中,用户单击按钮
  2. 该按钮触发对 SignalR Hub 的调用
  3. SignalR Hub 将消息发送到特定 SignalR 客户端
  4. SignalR 客户端接收事件/消息
  5. SignalR 客户端调用将消息存储在数据库中的方法
  6. SignalR 客户端调用 Hub 中的方法以返回结果
  7. Hub 将结果传递给用户

如果另一个用户同时单击该按钮,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("...");
});

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

【问题讨论】:

  • 你能详细说明一下吗...也许有一个示例场景?
  • 嗨@Hackerman。问题已更新。你能看一下吗?
  • 也许可以使用Task.Runfor 它,但我不确定您是否可以从不同的线程发回响应。我想知道设计。为什么 Web 应用程序(Hub)要通过 SignalR 与数据库层通信,而不使用 Web 服务或类似的东西。
  • 请看stackoverflow.com/questions/10180052/…你基本上不需要做任何事情来获得并发,你可能只担心你的共享状态

标签: c# signalr signalr.client


【解决方案1】:

这可以使用 Async/Await 来解决。 Async 函数将负责向 Hub 回复结果。

myHub.On<ExecuteRequestModel, string>("Execute", async (request, to) => 
    await onExecute(request, to)
);

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多