public void ScheduleTerminateExecution() { int currentCancelToken = ++_currentCancelToken; if (Interlocked.CompareExchange(ref _cancelTokenOrStatus, Scheduled, NonScheduled) != NonScheduled) //TODO: no need for interlocked? { throw new InvalidOperationException("ScheduleTerminateExecution cannot be called while previous one has not been canceled"); } if (_cancelCallbackFactory != null) // allow nulls in tests { var terminateRequested = new CancelRef(); _terminateRequested = terminateRequested; _cancelCallbackFactory( 1000, () => AnotherThreadCancel(currentCancelToken, GetHandle(), terminateRequested.Terminate)); } else { _terminateRequested = _defaultCancelRef; } }
public void ScheduleTerminateExecution() { int currentCancelToken = ++_currentCancelToken; if (Interlocked.CompareExchange(ref _cancelTokenOrStatus, Scheduled, NonScheduled) != NonScheduled) //TODO: no need for interlocked? throw new InvalidOperationException("ScheduleTerminateExecution cannot be called while previous one has not been canceled"); if (_cancelCallbackFactory != null) // allow nulls in tests { var terminateRequested = new CancelRef(); _terminateRequested = terminateRequested; _cancelCallbackFactory( 1000, () => AnotherThreadCancel(currentCancelToken, GetHandle(), terminateRequested.Terminate)); } else { _terminateRequested = _defaultCancelRef; } }