我对线程池效率有疑问。我不确定我是否了解整个概念。在问这个问题之前,我做了很多阅读,而且我知道,如果您有很多小型的,相对较快的功能,并且更重要的是-非阻塞任务,那么线程池是一个很好的解决方案。在线程池中使用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/

10-10 17:32