public void SuspendExecution()
{
lock (this)
{
// If a suspend is required, do it.
if (m_suspendRequired != 0)
ChangeEvent(m_canExecute, false);
}
// The application cannot return from Suspend until the task
// is suspended.
// This can happen in one of two ways:
// 1) The m_suspended event occurs, indicating that the
// execute thread has suspended, or
// 2) the canExecute flag is set, indicating that a suspend is
// no longer required.
WaitHandle [] suspendOperationComplete = {m_suspended, m_canExecute};
WaitHandle.WaitAny(suspendOperationComplete);
}