我有一系列需要处理的计算 – 计算和它们运行的顺序都是由用户在UI上定义的.
如果他们只是一个接一个地跑,那就不会太难了.但是,某些计算需要同时处理,并且所有计算必须能够随时单独暂停.我还需要能够随时重新安排订单或添加新的计算.所以,无论我做什么都必须足够灵活,以处理这个问题
在UI上,想象一下usercontrols的列表框(如果你愿意的话,一个队列) – 每个usercontrol显示计算名称和一个暂停按钮.我可以在处理过程中随时向此列表添加计算.
做这个的最好方式是什么?
我应该在自己的线程中运行每个计算吗?如果是这样,我应该如何存储正在运行的进程列表?如何将队列传递给计算处理器?我怎样才能确保每次队列更改(新订购或新计算)时计算处理器都会知道这一点?
我最初的想法是:
> CalcProcessor类
> CalcCalculation类
在CalcProcessor中有2个CalcCalculations列表.一个是UI上显示的“队列”(可能是指向它的指针?或者其他一些方法来确保它实时更新),另一个是当前正在运行的计算列表.
不知何故,我需要让CalcCalculation在自己的线程中运行来处理计算,并能够处理任何暂停事件.所以我需要一些方法将UI中按下的暂停按钮的信息传递给CalcProcessor对象,然后进入正确的CalcCalculation.
编辑以回应大卫霍普:
感谢您的回复.
>是的,有n个计算,但由于能够在UI上添加更多计算以进行处理,因此可能随时更改.
>他们无论如何都不需要共享数据.应用程序中将有一个设置来指定应该并发运行的数量(例如,在任何给定时间为10,例如队列中的前10个 – 当1结束时,队列中的下一个计算将开始处理).
>计算将涉及从某些数据源获取数据 – 它可以是数据库或文件,并对其进行分析并对该数据执行一些计算.当我说计算需要暂停时,我并不是说暂停线程…我只是意味着(例如,因为我还没有编写应用程序的这一部分)如果它是从一行逐行读取数据库并进行一些实时计算在处理当前行时完成暂停…并继续在UI上单击暂停按钮时 – 这可以通过原始作为一段时间(notPaused)循环提供我可以获得将UI中的信息暂停到线程中.
最佳答案 这里有几个问题:
如何同步UI和模型?
我觉得你倒退了这个.您的模型不应该具有指向您在UI中显示的队列的“指针”.相反,队列应该在您的模型中,您应该与INotifyPropertyChange和ObservableCollection一起使用数据绑定来显示UI上的队列. (至少这是在WPF中完成的.)
这样,您可以直接从模型中操作队列,它将自动显示在UI上.
如何启动和监控计算?
我认为任务是理想的.您可以使用Task.Factory.StartNew()启动任务.由于您的任务似乎需要很长时间才能执行,因此您可以考虑使用TaskCreationOptions.LongRunning
.您还可以使用任务找出计算何时完成(或者如果失败并出现异常).
如何暂停运行计算?
您可以使用ManualReserEventSlim
.通常,它会被设置,但如果你想暂停正在运行的任务,你会重置()它.计算需要定期调用该事件的Wait().如果没有与该线程上的计算合作,则无法合理地暂停正在运行的线程.
如果您使用的是C#5.0,更好的方法是使用类似PauseToken
的方法.