gpt4 book ai didi

c# - 使用多个工作线程、多个源和接收器线程来创建线程化 .net 应用程序的优雅方式?

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

我有一个应用程序,其中有多个提供数据的线程,需要经过一些繁重的数学运算。数学部分需要大量初始化,之后它非常快 - 因此我不能每次需要进行计算时都生成一个线程,也不应该每个源线程都有自己的求解器(可以有很多这样的线程,超过某个点内存需求是淫秽的,并且开销会妨碍处理能力)。

我想使用以下模型:数据收集和使用线程将通过一个线程安全接口(interface)函数调用单个对象,例如

public OutData DoMath(InData data) {...}

这样就可以解决剩下的问题了。这将涉及找到一个空闲的工作线程(或等待并阻塞直到一个可用)通过某种方式以线程安全的方式将数据传递给一个空闲的工作线程,等待(阻塞)它完成它的工作并收集结果并返回。

然后工作线程会进入某种 sleep /阻塞状态,直到一个新的输入项出现在它的界面上(或者一个清理和死亡的命令)。

我知道如何通过各种复杂的锁、队列和等待以一种非常可怕的方式来做到这一点。我猜想有更好、更优雅的方法。

我的问题是:

  1. 这是一个好的架构吗?
  2. 是否有常用的优雅方法来执行此操作?

目标框架是 .NET 4.5 或更高版本。

谢谢,

大卫

最佳答案

The math part needs a lot of initialization, afterwards it's pretty fast - as such I can't just spawn a thread every time I need to do the calculation, nor should every source thread have its own solver (there can be a LOT of such threads, beyond a certain point the memory requirements are obscene, and the overhead gets in the way or processing power).

听起来像是一个惰性初始化项目池。您可以为此使用基本的 BlockingCollection,但我建议使用类似堆栈的行为覆盖默认的类似队列的行为,以避免初始化您可能永远不需要的上下文。

我将调用昂贵的初始化类型 MathContext:

private static readonly BlockingColleciton<Lazy<MathContext>> Pool;

static Constructor()
{
Pool = new BlockingCollection<Lazy<MathContext>>(new ConcurrentStack<Lazy<MathContext>>());
for (int i = 0; i != 100; ++i) // or whatever you want your upper limit to be
Pool.Add(new Lazy<MathContext>());
}

This would involve finding a free worker thread (or waiting and blocking till one is available)

实际上,在这里使用工作线程是没有意义的。由于您的接口(interface)是同步的,调用线程可以自己完成工作。

OutData DoMath(InData data)
{
// First, take a context from the pool.
var lazyContext = Pool.Take();
try
{
// Initialize the context if necessary.
var context = lazyContext.Value;

return ... // Do the actual work.
}
finally
{
// Ensure the context is returned to the pool.
Pool.Add(lazyContext);
}
}

我还认为您应该查看 TPL 数据流库。这需要进行一些代码重组,但听起来它可能很适合您的问题域。

关于c# - 使用多个工作线程、多个源和接收器线程来创建线程化 .net 应用程序的优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32438629/

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