我需要在.NET 3.5 / C#/ WPF程序中多次执行两个并行任务。
在我的情况下,任务对设备提供的数据执行一些计算(Kinect)。因此,每次收到新数据时,我都需要开始执行不同计算的两个任务。
我为每个任务使用Thread
,当我收到新数据时,我使用new
语句重新创建每个线程。
// Data received
task1 = new Thread(new ThreadStart(ExtractData1));
task2 = new Thread(new ThreadStart(ExtractData2));
一切都正常,但我的问题是关于效率。 我想知道是否有更好的方法来实现这一目标......
我应该像这样继续使用Thread
吗?
每次重新创建Thread
会有性能影响吗?
我应该只创建一次Thread
并使用ManualResetEvent
来触发计算吗?
提前致谢。
答案 0 :(得分:0)
每个线程的创建会导致为其堆栈分配大约1MB的内存。那很贵。
除非你的计算是处理器密集型的,否则不要打扰线程。
您最好的选择是对所有三个选项进行基准测试。
答案 1 :(得分:0)
启动一个新的线程会带来一些额外的开销,一个可能的选择是使用ThreadPool
。
ThreadPool.QueueUserWorkItem(new WaitCallback(o => ExtractData1()));
ThreadPool.QueueUserWorkItem(new WaitCallback(o => ExtractData2()));
Here是开始使用ThreadPool的新线程与比较。真正的总结是,线程通常对于更长时间运行的任务(可能需要超过一秒或两秒)的性能更高,而ThreadPool能够回收现有线程,这减轻了许多初始开销。