CancellationTokenSource或AutoResetEvent

Ric*_*res 2 .net c# multithreading

现代.NET API使用CancellationTokenSource和CancellationToken取消线程之间的作业。是否有任何理由使用这些代替“旧的” AutoResetEvent和ManualResetEvent?我想像CancellationToken封装了类似的东西,正如它的WaitHandle属性所公开的那样。

Nit*_*ram 5

嗯,是。在内部CancellationTokenSource使用ManualResetEvent来处理取消事件的报告。

不过CancellationTokenSource,出于以下几个原因,您还是应该首选使用来取消内容:

  1. 名称正确。它取消了东西。因为一开始就很清楚此类实例的用途,所以这使阅读起来更加容易。
  2. .NET框架中的许多类都可以使用取消CancellationTokenSource。特别是System.Threading(和子包装中的)许多东西
  3. 虽然使用ManualResetEventCancellationTokenSource做了几件事情,以优化内部的事情。延迟初始化之类的东西。我希望这可以使其速度更快一些,并在某些情况下以较少的开销运行。

  • ManualResetEvent非常繁重,因此仅在使用CancellationToken.WaitHandle时创建。 (4认同)