我正在使用最新版本的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以便从服务器到达该集线器吗?