"固定"/"负载均衡"C#线程池?

Sle*_*mer 5 c# wcf multithreading

我有一个"昂贵"的第三方组件.该组件不是线程安全的.所述组件托管在WCF服务内(暂时),因此......每次呼叫进入服务时,我都必须新建组件.

我想要做的是拥有一个说16个线程的池,每个线程都旋转它们自己的组件副本,并且有一个机制来调用该方法并将其分配给16个线程中的一个并返回值.

所以很简单:

var response = threadPool.CallMethod(param1, param2);
Run Code Online (Sandbox Code Playgroud)

它可以阻止调用,直到它得到响应,因为我需要响应才能继续.

有什么建议?也许我正在过度思考它并且ConcurrentQueue由16个线程提供的服务可以完成这项工作,但是现在确定方法返回值将如何返回给调用者?

bri*_*ler 2

WCF 已经使用线程池来管理其资源,因此如果您在其之上添加一个线程管理层,结果只会很糟糕。如果可能的话,请避免这样做,因为您的服务调用将会发生争用。

在你的情况下我会做的只是使用一个ThreadLocal 线程静态,它将用你昂贵的对象初始化一次。此后它将可供线程池线程使用。

这是假设您的对象在 MTA 线程上运行良好;我猜这是来自你的帖子,因为听起来事情正在工作,但速度很慢。

人们担心会创建太多对象,并且随着池变得太大而使用太多内存。但是,在执行其他操作之前,请先看看实际情况是否如此。这是一个非常简单的策略,实施起来很容易试用。仅当您确实需要时才变得更加复杂。