首先 - 如果之前曾询问此问题或类似问题,请致歉。感觉应该是这样,但我一直都找不到。
我有一个第三方程序集,我正在调用一个方法,此方法的参数包含一个对象列表(概念而非List<object>
),并在可能长时间运行的算法后返回结果。
我在不同的线程上调用此方法以保持UI响应。并且它会定期调用并使用不同的值列表。这意味着当我想重新运行它时它经常运行。我遇到的问题是新线程的创建非常幼稚,因此每次都会触发一个新线程 - 这会导致多个线程运行不同的输入参数。我真正想要发生的是任何现有的线程都会因为我不再对它们的输出感兴趣而死掉。
我对多线程最佳实践不是很熟悉,所以我真的想就解决这个问题的最佳方法提出一些建议。
(我使用的是3.5,所以没有TPL)
修改
我破解了Reflector以查看内部发生了什么,并且很多代码都标记为protected
所以我非常确定我可以继续并在支票中包装调用以便按照以下答案提前退出。 / p>
答案 0 :(得分:4)
您可以将其视为生产者/消费者模式。
不是启动一个Thread,而是发布(生成)一个新的Datapacket。
消耗线程应该监视队列并在新数据包到达时开始。
请注意,停止线程是您的主要问题。甚至不看Thread.Abort()。您需要将该逻辑构建到线程代码中。
答案 1 :(得分:2)
您无法重新启动单个线程。您可以做的是维护一系列工作。然后,在执行作业时,您可以定期检查是否有更新的作业 - 如果有,则放弃当前作业并启动新作业。当每个“作业”包括执行许多任务(例如,作业中的多个输入上的相同任务或各种不同步骤)时,这是最简单的。在这种情况下,只需在开始每项任务之前进行检查。
答案 2 :(得分:1)
必须询问有关此第三方代码的几个问题:
如果两个问题的答案都是肯定的,那么你就处于困境。很难想象有任何方法可以将持久存储恢复到一致状态,这种状态不会比让算法运行完成更昂贵。 (虽然如果长时间运行意味着超过几分钟,那么执行VM克隆并将数据传输到它可能会减少工作量。)
如果问题不是,您可以中止处理。但Windows允许您彻底中止的最小单位是进程。您必须生成一个工作进程来执行计算。最直接的方法是构建一个TCP服务(.NET附带了这个工具--WCF)。如果第三方代码仅读取其输入数据,则可以使用共享内存等工具来降低将数据传输到此子流程的成本。