我有一个C#线程程序(游戏),用布尔值停止(大多数文章推荐)。
while (gameContinueRun)
{
createRound();
line1;
line2;
line3;
line4;
endRound();
}
某些代码行锁定游戏并等待其他线程释放它:
lock (stateSync)
{
Monitor.Wait(stateSync)
}
要从另一个线程停止线程,我将布尔值设置为false:
if (cancel)
{
gameContinueRun= false;
}
一切都很顺利,但我仍需要等到当前循环结束(圆形)。
我想结束循环,打破中间的所有工作(中止游戏)。另一件事是能够重新启动循环(打开新一轮)。换句话说,有两件事:
中止游戏
取消当前轮次并开始新的
我想到了,并且有两种方法:
解锁所有锁定,并在每个代码行后检查:
if (!cancelRound)
{
line1;
}
if (!cancelRound)
{
line2;
}
if (!cancelRound)
{
line3;
}
if (!cancelRound)
{
line4;
}
不是很好,如果有很多代码行可以覆盖......那就太累了......
使用Thread.Abort()
,根据需要抓住Exception
和resetAbort()
。
使用goto
和标签(我认为这更加丑陋然后中止)。
哪种方式更好?或者,还有更好的推荐方式吗?
答案 0 :(得分:1)
尝试查看您的锁的WaitHandle.WaitAny(WaitHandle [])方法。 然后,您可以使用AutoResetEvent或ManualResetEvent数组 - 一个用于退出,其余用于锁定。 看到: http://msdn.microsoft.com/en-us/library/yy12yx1f.aspx
答案 1 :(得分:0)
我通常最终写了很多
if (m_state != GameState.Active) {
return;
} // if
有点代码。
也许您可以使用自定义属性,类似于代码访问安全性。做一些像
这样的事情[RequireState(GameState.Active)]
void DoSomething();
答案 2 :(得分:0)
它并不完全清楚你要做什么,但看起来你想要某种形式的线程间通信。但是,游戏循环通常控制其他线程,而不是自己控制。所以相反,你有:
function GameLoop
start threads
while (continuing game loop)
tell threads to do something
wait for threads to finish doing something
end while
tell threads to stop
wait for threads to terminate
end function
使用锁和Monitor.Wait的解决方案很不寻常,可能不够健壮。我认为您需要对多线程进行一些研究,并尝试一些经典问题(例如餐饮哲学家)然后重新设计您的代码。