首页 > 解决方案 > 如何使用 SignalR 安排任务

问题描述

我正在使用最新版本的 ASP.NET Core 来使用 SignalR 开发游戏。我只想安排一件事……比赛开始后的比赛结束信号。

首先我尝试了 Coravel,但我不知道如何动态安排任务。然后我尝试了Hangfire。首先它失败了,因为它正在创建一个新的集线器,然后我尝试将集线器传递给我的任务并得到各种序列化错误。Chroniton 似乎太老了,无法依赖生产。

那么我如何从一个将在该集线器上运行的集线器内安排一个任务呢?我无法想象这是一个不常见的场景。

添加了展示问题的代码:

public async Task MatchStartRequest()
{
    var GroupName = PlayersAndGroups[Context.ConnectionId];
    await Clients.Group(GroupName).SendAsync("StartGame");
    GroupsAndRooms[GroupName].GameStarted = true;
    BackgroundJob.Schedule(() => EndGame(GroupName), System.TimeSpan.FromMinutes(1));
}

public async Task EndGame(string GroupName)
{
    await Clients.Group(GroupName).SendAsync("EndGame");
    PlayersAndGroups.Remove(Context.ConnectionId);
    GroupsAndRooms[GroupName].ConnectionIdsAndPlayers.Remove(Context.ConnectionId);
    if (GroupsAndRooms[GroupName].ConnectionIdsAndPlayers.Count == 0)
    {
        GroupsAndRooms.Remove(GroupName);
    }
    await Groups.RemoveFromGroupAsync(Context.ConnectionId, GroupName);
} 

如果我在 EndGame 的第一行(await SendAsync 函数)设置断点,我可以看到服务器正在尝试将消息发送到空集线器,这当然不起作用。如果我编辑 EndGame 方法以将 Hub 以及 GroupName 传递给它,服务器会给我一堆序列化错误。是否有我可以传递的集线器 ID 以从服务器到达该集线器?

标签: asp.net.netasp.net-coresignalrscheduled-tasks

解决方案


推荐阅读