我有一个Game框架,其中有一个实现IBotInterface的Bots列表.这些机器人是用户定制的,唯一的限制是他们必须实现接口.
游戏然后在机器人(希望并行)中调用诸如yourTurn和roundStart之类的各种事件的方法.我想让机器人只花费有限的时间来处理这些事件,然后才被迫退出计算.
我正在尝试的一个例子是:(NewGame是一个代表)
Parallel.ForEach(Bots, delegate(IBot bot)
{
NewGame del = bot.NewGame;
IAsyncResult r = del.BeginInvoke(Info, null, null);
WaitHandle h = r.AsyncWaitHandle;
h.WaitOne(RoundLimit);
if (!r.IsCompleted)
{
del.EndInvoke(r);
}
}
);
在这种情况下,我被迫运行可能不会终止的EndInvoke().我不能想到一个干净地中止线程的方法.
如果有某种事情会很好
try {
bot.NewGame(Info);
} catch (TimeOutException) {
// Tell bot off.
} finally {
// Compute things.
}
但我不认为可能做这样的一个结构.
这样做的目的是优雅地处理有意外的无限循环或花费很长时间来计算的AI.
解决这个问题的另一种可能的方法是拥有这样的东西(具有更多的c#和更少的伪代码)
Cla