【发布时间】:2024-05-23 03:05:02
【问题描述】:
我有一系列计算需要处理 - 计算和它们运行的顺序都是由用户在 UI 上定义的。
如果他们只是一个接一个地跑,那就不会太难了。但是,某些计算需要同时处理,并且所有计算必须具有随时单独暂停的能力。我还需要能够随时重新安排订单或添加要处理的新计算。所以无论我做什么都必须足够灵活来处理这个问题。
在 UI 上,想象一个用户控件的列表框(如果您愿意,可以是一个队列) - 每个用户控件都显示计算的名称和一个暂停按钮。而且我可以在处理过程中随时将计算添加到此列表中。
最好的方法是什么?
我应该在自己的线程中运行每个计算吗?如果是这样,我应该如何存储正在运行的进程列表?我如何将队列传递给计算处理器?我将如何确保每次队列更改(新排序或新计算)时计算处理器都会意识到这一点?
我最初的想法是:
CalcProcessor classCalcCalculation class
在 CalcProcessor 中有 2 个 Lists 和 CalcCalculations。一个是 UI 上显示的“队列”(可能是指向它的指针?或其他确保实时更新的方式),另一个是当前正在运行的计算列表。
不知何故,我需要让CalcCalculation 在自己的线程中运行以处理计算,并能够处理任何暂停事件。所以我需要一些方法将 UI 中按下的暂停按钮的信息传输到 CalcProcessor 对象,然后传输到正确的 CalcCalculation。
编辑以回应 David Hope:
感谢您的回复。
是的,有 n 个计算,但由于能够添加更多计算以在 UI 上进行处理,这可能随时更改。
无论如何,他们不需要共享数据。应用程序中有一个设置来指定应该同时运行多少个(即在任何给定时间 10 个,例如队列中的前 10 个 - 当 1 完成队列中的下一个计算时将开始处理)。
计算将涉及从某个数据源(可能是数据库或文件)获取数据,然后对其进行分析并对该数据执行一些计算。当我说计算需要暂停时,我并不是说暂停线程......我只是说(例如,因为我还没有编写应用程序的这一部分)如果它正在逐行读取数据库并在处理当前行完成时暂停一些实时计算......并在 UI 上未单击暂停按钮时继续 - 如果我能得到,这可以通过像 while(notPaused) 循环这样原始的东西来完成暂停信息从 UI 进入线程。
【问题讨论】:
-
你能用 C# 5.0 吗? “某些计算需要同时处理”到底是什么意思?都有些什么样的规矩?如果暂停计算是在浪费一个线程,会好吗?
-
我将使用 4.0,并且线程必须保持活动状态,因为即使计算已暂停,它也需要定期更新日志文件以显示计算仍处于活动状态(尽管已暂停)。并发运行的计算是指它们需要同时运行——计算不依赖于任何其他计算,但由于时间限制,它们必须同时运行。
标签: c# .net concurrency