【发布时间】:2018-07-02 07:13:02
【问题描述】:
我正在尝试为游戏构建界面。比赛进行1分钟。 GetStop 方法在游戏 60 秒后停止。 play 方法启动游戏,quit 方法退出游戏。现在理想情况下,当我在 30 秒后退出游戏时,计时器应该被重置,并且在单击“播放”按钮时,计时器应该再次运行 1 分钟。这样下一场比赛就可以运行 1 分钟。如果我再次按下退出按钮,则应为下一场比赛重置计时器。
但是,我的代码中似乎存在某个问题。每当我执行退出方法时,计时器似乎都保存在该状态。所以,如果我在 30 秒内退出比赛,那么下一场比赛将只持续 30 秒。如果我在 50 秒内退出比赛,下一场比赛将只持续 10 秒。理想情况下,计时器应该被重置,但不会被重置。
我在这里没有想法。谁能给点建议??
private async Task GetStop(CancellationToken token)
{
await Task.Run(async () =>
{
token.ThrowIfCancellationRequested();
await Task.Delay(TimeSpan.FromSeconds(60), token);
token.ThrowIfCancellationRequested();
if (!token.IsCancellationRequested)
{
sendMessage((byte)ACMessage.AC_ESCAPE);
}
}, token);
}
public async void Play()
{
sendMessage((byte)ACMessage.AC_START_RACE);
_cts.Cancel();
if (_cts != null)
{
_cts.Dispose();
_cts = null;
}
_cts = new CancellationTokenSource();
await GetStop(_cts.Token);
}
public void Quit()
{
_cts.Cancel();
if (_cts != null)
{
_cts.Dispose();
_cts = null;
}
//
}
【问题讨论】:
-
我不知道我是否正确理解了您的问题,但也许您认为取消
Task会阻止进程运行。这不是真的。只有作为进程包装器的任务本身将停止等待它,其余代码将继续,包括任务“内部”的进程。 -
您的代码只能在您允许的地方停止。因此,例如,如果您进行 5 分钟的睡眠,该睡眠将继续。您需要的是您的游戏循环有时间作为更新/处理条件的一部分。而不是调用“getstop”,在开始将变量设置为 now+
然后现在检查 -
谢谢,能否给我发个例子或参考链接?
-
如果您使用 Tasks 处理游戏循环,您可能不会对这里的问题的解决方案感到满意。看看this description 游戏循环的正常工作方式。
标签: c# task-parallel-library cancellation cancellationtokensource