joh*_*ohn 11 c# multithreading
我有一个void DoWork(object input)大约需要5秒才能完成的方法.我读过这个Thread比ThreadPool这些更长的操作更合适,但我遇到了一个问题.
我点击一个按钮,调用threadRun.Start(input)哪个运行并完成正常.我再次单击该按钮并收到以下异常:
Thread is running or terminated; it cannot restart.
你能否"重用"一个线程?我应该使用ThreadPool吗?与ThreadPool相比,为什么Thread"更适合更长时间的操作"?如果你不能重复使用一个线程,为什么要使用它(即它提供了哪些优势)?
Dav*_*rtz 11
你能否"重用"一个线程?
您可以.但是你必须编写线程不要终止,而是等待更多的工作.这就是线程池的作用.
我应该使用ThreadPool吗?
如果你想重用一个帖子,是的.
与ThreadPool相比,为什么Thread"更适合更长时间的操作"?
想象一个服务于大量快速操作的线程池.你不希望有太多的线程,因为计算机一次只能做很多事情.您创建线程池的每个长操作都会占用池中的线程.所以池要么必须有很多额外的线程,要么可能缺少线程.两者都不会导致高效的线程池设计.
对于更长的操作,与操作的成本相比,创建和销毁线程的开销非常小.因此,仅为操作使用线程的正常缺点不适用.
如果你不能重复使用一个线程,为什么要使用它(即它提供了哪些优势)?
我假设您的意思是使用专用于作业的线程,然后使用线程池终止.优点是线程数总是等于这样的作业数.这意味着你必须在每次启动一个作业时创建一个线程,并在每次完成一个线程时销毁一个线程,但是你从来没有额外的线程,也没有在线程上做空.(对于I/O绑定线程,这可能是一件好事,但如果大多数线程在大多数情况下都是CPU绑定的话,那么这可能是一件坏事.)