У меня есть Game Framework, где есть список ботов, которые реализуют IBotInterface. Эти боты настраиваются пользователем с единственным ограничением, что они должны реализовать интерфейс.
Игра затем вызывает методы в ботах (надеюсь, параллельно) для различных событий, таких как 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.
}
Но я не думаю, что это возможно сделать такую конструкцию.
Цель состоит в том, чтобы изящно обрабатывать ИИ, которые имеют случайные бесконечные циклы или занимают много времени, чтобы вычислить.
Другим возможным способом решения этой проблемы было бы иметь что-то вроде этого (с большим количеством С# и меньше псевдокода)
Class ActionThread {
pulbic Thread thread { get; set; }
public Queue<Action> queue { get; set; }
public void Run() {
while (true) {
queue.WaitOne();
Act a = queue.dequeue();
a();
}
}
Class foo {
main() {
....
foreach(Bot b in Bots) {
ActionThread a = getActionThread(b.UniqueID);
NewGame del = b.NewGame;
a.queue.queue(del);
}
Thread.Sleep(1000);
foreach (ActionThread a in Threads) {
a.Suspend();
}
}
}
Не самый чистый способ, но он будет работать. (Я буду беспокоиться о том, как передавать параметры и принимать возвращаемые значения позже).
[Дальнейшее редактирование]
Я не слишком уверен в том, что такое appdomain, из его взглядов я могу это сделать, но он не может понять, как это поможет
Я надеюсь не ожидать вредоносного кода. Попытка убить другие потоки ботов не является допустимым способом выиграть игру. Я просто хотел дать каждому боту секунду для вычисления, а затем перейти с игровым процессом, поэтому в основном ожидаем медленный или прослушиваемый код здесь.
Я пытаюсь посмотреть, что я могу сделать с Task, медленно и медленно.
Я прочитаю, что CAS может сделать, спасибо вам, ребята
[Больше править]
У меня болит голова, я больше не могу думать или писать. Я настраиваю систему передачи сообщений на выделенный поток на каждого бота и приостанавливаю/спаю те потоки
Я решил, что буду использовать полностью сокетную клиентскую систему сервера. Так что клиент может делать все, что захочет, и я просто проигнорирую, если он откажется отвечать на сообщения сервера. Жаль, что это должно было прийти к этому.