У меня есть игровая платформа, в которой есть список ботов, которые реализуют 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.
}
Но я не думаю, что возможно создать такую конструкцию.
Цель этого состоит в том, чтобы изящно обрабатывать ИИ, у которых есть случайные бесконечные циклы или для вычисления которых требуется много времени.
Другим возможным способом решения этой проблемы было бы иметь что-то вроде этого (с большим количеством C # и меньшим количеством псевдокода)
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, по внешнему виду я мог бы это сделать, но он не может понять, как это могло бы помочь
Я надеюсь не ожидать вредоносного кода. Попытка уничтожить другие потоки ботов - недопустимый способ выиграть игру. Я просто хотел дать каждому боту секунду для вычисления, а затем продолжить процесс игры, так что в основном ожидаю медленного или ошибочного кода здесь.
Я пытаюсь понять, что я могу сделать с Задачей, медленно куда-то добраться.
Я прочитаю, что может сделать CAS, спасибо, ребята
[Больше править]
У меня болит голова, я больше не могу думать или кодировать. Я настраиваю систему передачи сообщений в отдельный поток для каждого бота и приостанавливаю / сплю эти потоки
Я решил, что буду использовать полностью серверную клиентскую систему. Так что клиент может делать все, что он хочет, и я просто проигнорирую, если он отказывается отвечать на сообщения сервера. Жаль, что до этого дошло.