Ho implementato un ciclo motore di gioco come segue:Esistono le migliori pratiche per l'implementazione di un ciclo asincrono del motore di gioco?
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;
}
Sto usando la classe AsyncResult
consigliato da Jeff Richter nel suo articolo, Implementing the CLR Asynchronous Programming Model. Per essere in grado di fermare il motore dall'interfaccia utente, l'implementazione che ho utilizzato era un po 'diversa dallo schema asincrono standard. Questa implementazione funziona come previsto, ma quando mi allontano da una pratica standard, torno alla comunità SO per garantire che sto facendo le cose nel modo giusto.
Ci sono problemi con questa implementazione che chiunque può vedere?
in un ciclo di gioco, non si genera semplicemente una nuova discussione anziché utilizzare un thread di pool? –
@Mitch: non ne sono proprio sicuro. Credo che la generazione di una nuova discussione sia standard. Non so che ci sia qualcosa di sbagliato nell'usare un thread di Threadpool. Questo motore di gioco è super leggero. Inoltre, dal momento che l'interfaccia utente di WinForms è * in controllo *, ho pensato che sarebbe stato un buon modo per gestire il ciclo di gioco. – IAbstract
Perché stai usando * qualsiasi * thread in un ciclo di gioco? Se * hai * bisogno di qualsiasi (che dovrebbe essere davvero messo in discussione), i thread dovrebbero probabilmente essere thread pre-spawnati per uno * scopo ben definito * (ad es. Sempre 2 thread, ecc. Che vivono continuamente) che funzionano fuori da una coda o altra sincronizzazione. Tuttavia, il migliore è probabilmente solo per tenerlo "KISS". –