Есть ли лучшие практики для реализации цикла асинхронного игрового движка? - PullRequest
7 голосов
/ 02 января 2011

Я реализовал цикл игрового движка следующим образом:

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-сообществу, чтобы убедиться, что я все делаю правильно.

Есть ли какие-либо проблемы с этой реализацией, которые кто-либо может увидеть?

Ответы [ 2 ]

11 голосов
/ 02 января 2011

Поскольку это звучит как проект, которым вы управляете, я бы посоветовал вам отказаться от APM и использовать модель на основе Task, представленную в .NET4.Это рекомендуемый подход для .NET4 вместо APM.Класс Task является частью параллельной библиотеки задач ( TPL ), но также отлично подходит для этих основных асинхронных заданий.

2 голосов
/ 02 января 2011

Я бы сказал, что подразумевается, что задачи являются краткосрочными при использовании пула потоков, поскольку количество потоков в нем ограничено.

В вашем случае я бы использовал BackgroundWorker, поскольку вы упомянули winforms.BW выполняет синхронизацию для вас и поэтому может обновлять графический интерфейс без использования InvokeRequired и т. Д.

...