如何使用SignalR

时间:2018-10-12 08:04:39

标签: asp.net .net asp.net-core signalr scheduled-tasks

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

首先,我尝试了Coravel,但是我不知道如何动态安排任务。然后我尝试了Hangfire。首先,它由于创建新的Hub而失败,然后我尝试将Hub传递给我的任务,并遇到各种序列化错误。 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以便从服务器到达该集线器吗?

0 个答案:

没有答案