我对线程池效率有疑问。我不确定我是否了解整个概念。在问这个问题之前,我做了很多阅读,而且我知道,如果您有很多小型的,相对较快的功能,并且更重要的是-非阻塞任务,那么线程池是一个很好的解决方案。在线程池中使用lock
是非常糟糕的。
这是我的问题:如何从线程池函数返回值?如果您有要运行的函数,它们可能会产生一些结果,对吗?最好将这些结果存储在某个地方。 在哪里?
我正在运行c.a.线程池中200k的快速功能。结果存储在List
中。我当然要做:
lock(lockobj)
{
myList.Add(result);
}
那么,这是正确的方法吗?我的意思是,如果您的函数返回SOMETHING,则必须将其存储在某种集合中。它必须是一个阻塞的集合。因此,我开始思考... “在线程池中,阻塞非常容易,但是您必须至少执行一次-在每个函数的末尾
如何存储/返回线程池中运行的函数的结果?
谢谢!
JB
编辑:通过“功能” 我的意思是...
ThreadPool.QueueUserWorkItem(state =>
{
Result r = function(); // previously named "Task"
lock(lockobj)
{
allResults.Add(r);
}
}
最佳答案
如果您不想阻止ThreadPool
线程,请使用无锁方法。排队项目时,ConcurrentQueue
当前是无锁的(自.NET 4.6.2起)。
因此,只需执行以下操作:
public static ConcurrentQueue<Result> AllResults { get; } = new ConcurrentQueue<Result>();
ThreadPool.QueueUserWorkItem(state =>
{
Result r = function();
AllResults.Enqueue(r);
}
这将确保您不会阻塞
ThreadPool
线程。关于c# - 如何存储在线程池中运行的任务的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40752464/