最好的方法:为所有线程工作者实现中断/取消功能

时间:2010-05-19 18:54:00

标签: c# .net multithreading

所以我的问题是如何以最佳和最优雅的方式在应用程序中的所有(我的意思是ALL)线程工作者中实现取消/中断功能?

如果它是HttpWebRequest,IO操作或计算,那就不重要了。用户应该有可能随时取消每个操作/线程。

3 个答案:

答案 0 :(得分:6)

将.NET 4.0 TaskCancellationToken一起使用 - 它们是新的通用取消系统。

答案 1 :(得分:5)

  

用户应该有可能   取消任何动作/主题   时刻。

线程是一种练习,而不是一种设计......相信我已经尝试过它作为一种设计,但却失败了。在任何时刻简单地取消任何操作的基本问题是,在多线程环境中,它只是邪恶!想象一下,你有一段由锁保护的代码,你有两个并行运行的线程:

  1. 线程1获取锁定。
  2. 线程2等待,直到锁被释放,以便它可以获取它。
  3. 线程1在持有锁定时被取消,并且不会释放锁定。
  4. DEADLOCK :线程2正在等待从不发布的锁定。
  5. 这是最简单的示例,从技术上讲,我们可以在设计中处理这种情况,即自动释放线程已获取的任何锁,但不是锁,而是考虑对象状态,资源利用率,客户端依赖性等。你的线程正在修改一个大对象并且它在修改过程中被取消,然后对象的状态可能不一致,你正在使用的资源可能会被挂起,客户端依赖于该线程可能会崩溃...有很多事情可能发生,根本没有办法为它们设计。在这种情况下,您可以通过练习来管理主题:确保安全取消您的主题。

    其他人已经提到了启动可以取消的线程的各种方法,但我只是想触及这些原则。即使在有取消线程的方法的情况下,仍然必须记住,您有责任确定最安全取消线程的方法。

      

    如果它是HttpWebRequest,IO操作或计算,那就不重要了。

    我希望你现在明白为什么它是最重要的事情!除非你明确知道你的线程在做什么,否则没有安全的方法可以自动取消它。

    P.S。
    要记住的一件事是,如果你不想为每一个挂起线程,你可以将Thread.IsBackground标志设置为true,当你的应用程序退出时它们会自动关闭。

答案 2 :(得分:0)

您的工作线程需要一种方法来检查您的主线程,看看它们是否应继续运行。一种方法是共享由UI设置的static volatile bool,并由工作线程定期检查。

我的首选是创建自己的线程来运行工作类的实例,这些实例定期调用主线程提供的回调方法。此回调返回一个值,告诉工作人员继续,暂停或停止。

避免使用Thread.Abort()来杀死工作线程的诱惑:Manipulating a thread from a different thread