假设我们有一个触发以下方法的事件:
public static void DoSomeWork(object obj)
{
CancellationTokenSource cts = (CancellationTokenSource)obj;
if (cts.IsCancellationRequested)
return;
Console.WriteLine("Started thread {0}.", Name);
for (int i = 0; i < 3; i++)
{
Console.WriteLine("Working on thread {0} at step {1}.", Name, i);
Thread.Sleep(10000);
if (cts.IsCancellationRequested)
{
Console.WriteLine("Canceled thread {0} at step {1}.", Name, i);
return;
}
}
Console.WriteLine("Completed thread {0}.", Name);
}
您可以忽略该Name
变量,因为原始对象是包含名称作为字符串和CancellationTokenSource
. 据我了解,如果我在检测到之后ManualResetEvent.WaitOne()
调用,我可以使用等待取消完成。如果我只有一个新事件要处理,这似乎工作正常。但是,如果我在当前进程取消时多次触发此事件,它现在会同时运行这两个事件。期望的结果是最近事件之前的所有事件都被取消并且处理在最近的事件上运行。ManualResetEvent.Set()
cts.IsCancellationRequested == true
我怎样才能使这项工作?我在正确的轨道上吗?如果我可以提供任何其他信息来帮助回答这个问题,请告诉我。