我有一个连接到主机的进程,并无限地检查是否有新数据要处理。
我的应用程序有近500个线程,每个线程都以无限循环运行..
以下是代码:
for(i=1; i<=500; i++)
{
Thread instanceCaller = new Thread(new ThreadStart(infiniteProcess));
instanceCaller.Start();
}
是否有更好的方法使用C#async编写此代码。此外,如果我们使用async而不是threadstart,是否会有任何性能改进。
我想澄清为什么我要创建500个线程并让线程池对我不起作用。
基本上,每个线程都会打开一个到主机的专用套接字连接。主机向此套接字发送消息,然后路由到相应的目标(在数据库中配置)。目的地可以是硬件设备(打印机等)或一些其他设备。
我们无法创建线程池,因为每个线程都非常活跃并且不断地从主机接收消息并处理它们。从线程池加载和卸载线程的开销是低效的。
我使用线程创建的原始应用程序运行良好..但我想看看是否有任何方法可以通过利用C#5.0中的新功能来提高效率。
答案 0 :(得分:3)
当你进入数百个线程时,你应该考虑用异步IO和异步等待来替换阻塞。 许多线程导致高内存使用和操作系统调度开销。
尝试删除阻止最长的呼叫。应用80-20原则。您不必全部异步。
那说与这么多线程相关的开销通常被高估了。如果你全部异步,你的代码将不突然变得快2倍。 Async实际上只会改变操作开始和结束的方式。操作本身(IO或等待)根本没有加速。
此外,async不会增加容量。您的CPU不会变得更快,数据库无法处理更多操作,并且网络也具有固定的吞吐量。 Async IO实际上是关于节省内存和调度开销。
您不会使用500个线程达到操作系统限制。我最近使用testlimits.exe在我的机器上创建了100,000个线程,没有太多麻烦。限制非常高。