Compared to the preceding code for class RulyCanceler, I wanted to run code using CancellationTokenSource.
How do I use it as mentioned in Cancellation Tokens, i.e. without throwing/catching an exception? Can I use the IsCancellationRequested property?
I attempted to use it like this:
cancelToken.ThrowIfCancellationRequested(); and
try { new Thread(() => Work(cancelSource.Token)).Start(); } catch (OperationCanceledException) { Console.WriteLine("Canceled!"); } but this gave a run-time error on cancelToken.ThrowIfCancellationRequested(); in method Work(CancellationToken cancelToken):
System.OperationCanceledException was unhandled Message=The operation was canceled. Source=mscorlib StackTrace: at System.Threading.CancellationToken.ThrowIfCancellationRequested() at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33 at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: The code that I successfully ran caught the OperationCanceledException in the new thread:
using System; using System.Threading; namespace _7CancellationTokens { internal class Token { private static void Main() { var cancelSource = new CancellationTokenSource(); new Thread(() => { try { Work(cancelSource.Token); //).Start(); } catch (OperationCanceledException) { Console.WriteLine("Canceled!"); } }).Start(); Thread.Sleep(1000); cancelSource.Cancel(); // Safely cancel worker. Console.ReadLine(); } private static void Work(CancellationToken cancelToken) { while (true) { Console.Write("345"); cancelToken.ThrowIfCancellationRequested(); } } } }
CancellationTokenSourcewith async methods, long running methods with polling, and using a callback.