所以我的问题是如何以最佳和最优雅的方式在应用程序中的所有(我的意思是ALL)线程工作者中实现取消/中断功能?
如果它是HttpWebRequest,IO操作或计算,那就不重要了。用户应该有可能随时取消每个操作/线程。
答案 0 :(得分:6)
将.NET 4.0 Task
与CancellationToken
一起使用 - 它们是新的通用取消系统。
答案 1 :(得分:5)
用户应该有可能 取消任何动作/主题 时刻。
线程是一种练习,而不是一种设计......相信我已经尝试过它作为一种设计,但却失败了。在任何时刻简单地取消任何操作的基本问题是,在多线程环境中,它只是邪恶!想象一下,你有一段由锁保护的代码,你有两个并行运行的线程:
这是最简单的示例,从技术上讲,我们可以在设计中处理这种情况,即自动释放线程已获取的任何锁,但不是锁,而是考虑对象状态,资源利用率,客户端依赖性等。你的线程正在修改一个大对象并且它在修改过程中被取消,然后对象的状态可能不一致,你正在使用的资源可能会被挂起,客户端依赖于该线程可能会崩溃...有很多事情可能发生,根本没有办法为它们设计。在这种情况下,您可以通过练习来管理主题:您确保安全取消您的主题。
其他人已经提到了启动可以取消的线程的各种方法,但我只是想触及这些原则。即使在有取消线程的方法的情况下,仍然必须记住,您有责任确定最安全取消线程的方法。
如果它是HttpWebRequest,IO操作或计算,那就不重要了。
我希望你现在明白为什么它是最重要的事情!除非你明确知道你的线程在做什么,否则没有安全的方法可以自动取消它。
P.S。
要记住的一件事是,如果你不想为每一个挂起线程,你可以将Thread.IsBackground
标志设置为true
,当你的应用程序退出时它们会自动关闭。
答案 2 :(得分:0)
您的工作线程需要一种方法来检查您的主线程,看看它们是否应继续运行。一种方法是共享由UI设置的static volatile bool
,并由工作线程定期检查。
我的首选是创建自己的线程来运行工作类的实例,这些实例定期调用主线程提供的回调方法。此回调返回一个值,告诉工作人员继续,暂停或停止。
避免使用Thread.Abort()来杀死工作线程的诱惑:Manipulating a thread from a different thread。