我有一个 GUI C# 应用程序,它有一个启动/停止按钮。
最初,此 GUI 是创建类的单个实例,该实例查询数据库并在有结果时执行某些操作,并一次从数据库中获取单个“任务”。
然后我被要求尝试利用某些 8 核系统上的所有计算能力。使用我认为的处理器数量,我可以创建该数量的类实例并运行它们,并且非常接近于使用相当数量的计算能力。
Environment.ProccessorCount;
使用这个值,在 GUI 形式中,我一直在尝试通过 ProccessorCount 循环次数并启动一个调用类中“doWork”类型方法的新线程。然后休眠 1 秒(以确保初始查询通过),然后继续循环的下一部分。
然而,我一直对此有疑问,因为它似乎要等到循环完成才能开始查询,导致某种冲突(从 MySQL 数据库获取相同的值)。
在主窗体中,一旦它启动了“workers”,它就会将按钮文本更改为 STOP,如果再次按下按钮,它应该对每个“worker”执行一个“stopWork”方法。
我试图完成的事情有意义吗?有没有更好的方法来做到这一点(不涉及重组 worker 类(Class))?
最佳答案
重构您的设计,让一个线程在后台运行,检查您的数据库是否有工作要做。
当它找到工作要做时,为每个工作项生成一个新线程。
不要忘记对关键的有限资源使用同步工具,例如信号量和互斥量。微调同步值得您花时间。
您还可以试验工作线程的最大数量 - 我猜它会比您当前的处理器数量多一些。
关于C# 创建与处理器一样多的类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1018714/