【发布时间】:2011-05-19 08:41:45
【问题描述】:
我有一个线程数组,其中每个线程从线程搜索管理器获取搜索任务 - 使用生产者/消费者模块 - 当它完成时,它会等待来自搜索管理器线程的下一个信号。搜索是通过网络执行的 - 这需要大量时间(主要是获取 html 数据部分)。 我的问题是当用户选择停止当前搜索并开始一组新搜索时,所有搜索在上一次网络搜索期间都很忙,所以目前,用户一直等到不再相关的搜索结束他们的任务和开始新的。
我的问题是 - 我如何才能立即开始新的相关任务? 我不能使用标志(指示线程跳过搜索),因为漫长的等待是为了获取 http 方法。 有没有办法积极地停止该方法并从头开始? (我不喜欢使用新线程...)
提前致谢,
Shmouel。
【问题讨论】:
-
为什么你不想使用新线程?这是最明显的选择。设置一个标志来告诉现有操作它不再需要,并启动一个新线程。
-
将线程专用于受 IO 限制的操作会产生过多的开销。最好使用已经包含对请求取消的支持的任务(通过
CancelationToken。这样您就无需实现和维护自己的线程池。在任务实现中使用尽可能多的异步 IO 将最大限度地减少线程数使用中,从而提高应用程序的性能。 -
如果您有权访问 .NET 4,则可以使用 Task 类和取消令牌来完成此操作。
-
首先 - 感谢 .net 4 的建议。不幸的是,我使用的是 .net 3.5。 @Jon - 如果我将使用新线程 - 每次用户选择新搜索时都会产生新线程,这将导致许多线程同时运行,尽管它们都不相关。还有其他建议吗?
-
如果您定期检查线程中的标志,它们不会真正长时间地同时占用 CPU。当然,您可能会在多个线程中获取 HTTP 资源,但这真的很糟糕吗?您要避免的负面影响是什么?
标签: c# .net multithreading thread-abort