public void Run(Func<bool> workFunc)
{
SynchronizationContext oldSyncCtx = null;
try
{
oldSyncCtx = SynchronizationContext.Current;
var syncCtx = new GameSyncContext(this);
SynchronizationContext.SetSynchronizationContext(syncCtx);
bool again = true;
while (m_exit == false)
{
if (!again)
m_signal.WaitOne();
again = false;
KeyValuePair<SendOrPostCallback, object> entry;
if (m_queue.TryDequeue(out entry))
{
entry.Key(entry.Value);
again |= m_queue.Count > 0;
}
again |= workFunc();
}
}
finally
{
SynchronizationContext.SetSynchronizationContext(oldSyncCtx);
}
}