首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发处理的设计思想

并发处理的设计思想
EN

Stack Overflow用户
提问于 2013-02-05 14:20:57
回答 5查看 155关注 0票数 4

我有一系列需要处理的计算--计算和运行顺序都是由UI上的用户定义的。

如果他们只是一个接一个地跑,就不会太难了。但是,有些计算需要同时处理,所有计算都必须能够在任何时候单独暂停。我还需要能够重新安排订单或添加新的计算在任何时候处理。因此,无论我做什么,都必须有足够的灵活性来处理这件事。

在UI中,想象一个用户控件的列表框(如果您愿意的话,是一个队列)--每个用户控件都显示计算的名称和一个暂停按钮。我可以在处理过程中的任何时候将计算添加到这个列表中。

,什么是最好的方法?

我应该在自己的线程中运行每个计算吗?如果是这样,我应该如何存储正在运行的进程的列表?如何将队列传递给计算处理器?如何确保每次队列更改(新排序或新计算)时,计算处理器都会意识到这一点?

我最初的想法是:

  • CalcProcessor class
  • CalcCalculation class

CalcProcessor中有2 Lists of CalcCalculations。其中一个是如UI所示的“队列”(可能是指向它的指针)。或者其他一些方法来确保它实时更新),另一种方法是当前正在运行的计算列表。

不知何故,我需要让CalcCalculation在它自己的线程中运行,以处理计算,并能够处理任何暂停事件。因此,我需要一些方法来将用户界面中按下的暂停按钮的信息传送到CalcProcessor对象,然后发送到正确的CalcCalculation中。

编辑对大卫·霍普的回应:

感谢您的回复。

  1. 是的,有n个计算,但由于能够在UI上添加更多的计算来处理,这在任何时候都可能发生变化。
  2. 无论如何,他们不需要共享数据。应用程序中将有一个设置来指定应该并发运行的数量(即。10在任何给定的时间,例如队列中的前10,当1完成队列中的下一个计算时,将开始处理)。
  3. 计算将涉及从某些数据源获取数据--它可以是数据库或文件,并对其进行分析并对这些数据进行一些计算。当我说需要暂停计算时,我不是说暂停线程.我的意思是(例如,由于我还没有编写应用程序的这一部分),如果它正在逐行从数据库中读取,并在完成当前行的处理时暂停执行一些活计算.并继续在UI上打开pause按钮--如果我可以将UI中的暂停信息从UI中获取到线程中,则可以使用类似于a while(notPaused)循环的内容来完成这一操作。
EN

回答 5

Stack Overflow用户

发布于 2013-02-05 14:56:32

这里有几个问题:

如何同步UI和模型?

我想你把这个倒了。您的模型不应该有指向您在UI中显示的队列的“指针”。相反,队列应该在您的模型中,您应该使用与INotifyPropertyChangeObservableCollection一起的数据绑定来在UI上显示队列。(至少WPF就是这样做的。)

这样,您就可以直接从模型中操作队列,并且它将自动显示在UI上。

如何启动和监控计算?

我认为Task是这方面的理想选择。您可以使用Task启动Task.Factory.StartNew()。由于您的Task执行起来似乎需要很长时间,所以您可以考虑使用TaskCreationOptions.LongRunning。您还可以使用Task来找出计算何时完成(或者它是否在异常情况下失败)。

如何暂停运行计算?

为此您可以使用ManualReserEventSlim。通常,它会被设置,但是如果您想暂停运行的Task,您将Reset()它。计算将需要对该事件定期调用Wait()。如果没有对该线程的计算的协作,就不可能合理地暂停正在运行的线程。

如果您使用的是C# 5.0,一个更好的方法是使用类似PauseToken的东西。

票数 2
EN

Stack Overflow用户

发布于 2013-02-05 14:31:19

在Framework4.5中,这里的答案是异步API,它消除了管理线程的需要。有关详细信息,请查看异步/等待关键字。

从更广泛的角度来看,"CalcProcessor“类是个好主意,但我认为Task足以取代您的"CalcCalculation”类。处理器可以简单地具有可枚举的任务。如果需要,处理器可以公开用于管理队列的方法,以及返回有关其状态的信息。当应用程序最终到达必须有结果的状态时,可以使用AwaitAll方法阻塞CalcProcessor的线程,直到所有任务完成为止。

如果没有更多关于实际目标的信息,很难给出更好的建议。

票数 0
EN

Stack Overflow用户

发布于 2013-02-05 14:31:20

您可以使用观测器模式在UI上显示结果,并将更改重新输入处理器。状态命令模式将帮助您启动、暂停、取消计算。这些模式在设计上对你的问题有很好的答案。并发仍然是一个问题,它们不回答多线程问题,但是它们为管理线程开辟了一条更容易的道路。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14709674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档