4

我制作了一个针对我的特定需求进行优化的自定义 ThreadPool。但是,当进程中有多个 AppDomain 时,CLR ThreadPool 能够在所有 AppDomain 之间共享,我希望能够重现这种行为。

这可以使用 MarshalByRefObject 和 Remoting 来创建分布式线程池,但我担心它会增加不必要的开销,因为自定义线程池的关键目标是性能。

另一个理论上的解决方案是使用非托管对象破解 AppDomain 内存边界。如果我是正确的,AppDomain 中的内存边界仅适用于托管对象,因此每个 AppDomain 中可能有一个托管包装器都指向同一个非托管对象。

所以我的问题是:

  1. 有没有办法以最小的开销使用远程处理来制作自定义线程池?
  2. 如果没有,是否可以跨 AppDomain 共享非托管对象?
4

2 回答 2

2

在每个 appdomain 中创建一个新的线程池实例,然后使用信号量来控制跨所有实例运行的线程总数。这意味着您仍然可以处理相同的并发作业总数,但不必担心编组。

MSDN 文档有一个例子。

于 2009-11-19T00:33:33.027 回答
0

仔细考虑之后,尝试重新实现进程范围的 ThreadPool 可能是个坏主意,CLR ThreadPool 已经为此进行了优化。

就我而言,我希望能够更灵活地对排队进入池的工作项进行优先级排序,这可以通过在现有 CLR ThreadPool 之上构建的层来完成。

于 2009-11-19T16:31:53.390 回答