C# 创建与处理器一样多的类实例

标签 c# multithreading

我有一个 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/

相关文章:

c# - MS SQL如何记录负时间

c# - 多个 .WhenAny(...).ToPropertyEx(...) 调用是否应该相互覆盖?

c# - System.Threading.Timer 与 System.Threading.Thread.Sleep 解析 - .NET Timer 不使用系统时钟解析

c - 在多线程服务器程序中使用 linux 信号处理程序实现每 25 毫秒执行一次浮点计算的程序?

arrays - 使用 .NET 多线程运行同一应用程序的多个实例

c# - ASP.NET 网络 API : How to create a persistent collection across requests?

c# - Combobox如何通过鼠标单击在记事本(运行时)中获取数据?

c# - NMock3 如何模拟没有参数的方法?

java - 如何将数据从线程发送到主要 Activity java android

java - java中的同步实例方法