Я реализовал цикл игрового движка следующим образом:
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, чтобы убедиться, что все делаю правильно.
Есть ли какие-либо проблемы с этой реализацией, которые кто-либо может увидеть?