Я реализовал цикл игрового движка следующим образом:
public static Boolean Start ( )
{
if (hasBoard)
{
// start engine on worker thread
asyncTask = new AsyncResult ( stopEngine, asyncTask );
isRunning = ThreadPool.QueueUserWorkItem ( startEngine, asyncTask );
if (isRunning)
{
Console.WriteLine ( "[{0}] Engine started",
DateTime.Now.ToString ( "hh:mm:ss" ) );
}
else
{
Console.WriteLine ( "[{0}] Engine failed to start",
DateTime.Now.ToString ( "hh:mm:ss" ) );
}
}
return isRunning;
}
public static void Stop ( )
{
Console.WriteLine ( "[{0}] Engine stopping",
DateTime.Now.ToString ( "hh:mm:ss" ) );
asyncTask.SetAsCompleted ( null, false );
}
private static void startEngine ( Object task )
{
while (!( (IAsyncResult)task ).IsCompleted)
{
Thread.Sleep ( 10000 );
Console.WriteLine ( "[{0}] Engine running",
DateTime.Now.ToString ( "hh:mm:ss" ) );
}
}
private static void stopEngine ( IAsyncResult iaResult )
{
// clean up resources
Console.WriteLine ( "[{0}] Engine stopped",
DateTime.Now.ToString ( "hh:mm:ss" ) );
isRunning = false;
}
Я использую класс AsyncResult
, рекомендованный Джеффом Рихтером в его статье, Реализация модели асинхронного программирования CLR ,Чтобы иметь возможность остановить движок от пользовательского интерфейса, реализация, которую я использовал, была немного отлична от стандартной асинхронной схемы.Эта реализация работает, как и ожидалось, но когда я отклоняюсь от стандартной практики, я возвращаюсь к SO-сообществу, чтобы убедиться, что я все делаю правильно.
Есть ли какие-либо проблемы с этой реализацией, которые кто-либо может увидеть?