【问题标题】:C# Thread method reset problemC#线程方法重置问题
【发布时间】: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


【解决方案1】:

我发现了一个应该有用的类似 stackoverflow 线程。诀窍是使用 BeginGetResponse 而不是 GetResponse 来调用 HTTP 请求的中止: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.abort.aspx

原帖链接: Killing HttpWebRequest object using Thread.Abort

【讨论】:

  • @user680811 我也无法更改(至少没有严重的代码更改:-))http请求方法......但是,如果我没有任何其他选择,我会使用它.谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2022-01-08
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多