public void Start()
{
lock (this)
{
if (isRunning)
{
throw new AlreadyRunningException();
}
// Set this flag here, not inside InternalStart, to avoid
// race condition when Start called twice in quick
// succession.
isRunning = true;
}
new MethodInvoker(InternalStart).BeginInvoke(null, null);
}