gpt4 book ai didi

c# - 如何存储在线程池中运行的任务的结果?

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:35 25 4
gpt4 key购买 nike

我在线程池效率方面遇到了问题。我不确定我是否理解整个概念。在问这个问题之前我做了很多阅读并且我知道线程池是一个很好的解决方案,如果你有很多小的,相对快速的函数并且更重要的是 - 非阻塞任务。在线程池中使用 lock 非常糟糕。

这是我的问题:如何从线程池函数返回值?如果您要运行函数,它们可能会产生一些结果,对吗?最好将这些结果存储在某个地方。 在哪里?

我正在运行线程池中有 200k 非常快的函数。我将结果存储在 List 中。当然我必须这样做:

lock(lockobj)
{
myList.Add(result);
}

那么,这是正确的方法吗?我的意思是,如果您的函数 返回一些东西,您必须将它们存储在某种集合中。它必须是一个阻塞集合。所以,我开始思考......“阻塞在线程池中非常重要,但你必须这样做,至少一次 - 在每个函数结束时

如何存储/返回线程池中运行的函数的结果?

谢谢!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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com