假设我们有一个触发以下方法的事件:
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
等待取消完成。如果我只有一个要处理的新事件,这似乎工作正常。但是,如果我在当前进程取消时多次触发此事件,它现在会同时运行这两个事件。期望的结果是取消最近事件之前的所有事件,并且处理在最近的事件上运行。
我该如何使这项工作?我是在正确的轨道上吗?如果我能提供任何可以帮助回答此问题的其他信息,请告诉我。