为非线程安全代码构建工作线程池

时间:2009-12-16 20:31:38

标签: .net concurrency thread-safety appdomain worker-process

在.net框架中包装非线程安全代码的最佳方法是什么?

由于使用了静态变量,我有一个非线程安全的第三方库。重写它不是一种选择。该库由接收大量同时调用的asp.net Web服务使用。

我现在把它包装在一个使用锁来确保线程安全的代理类中:

private static readonly object oneThreadAtATimePlease = new object();
public ISomething CalculateSomething(int someValue)
{
    lock (oneThreadAtATimePlease)
    {
        return new UnsafeLibrary(someValue).DoSomething();
    }
}

性能很差,因为多个呼叫者必须等待锁定,但结果是正确的。

我想通过运行此库的多个实例来提高性能,每个实例都在自己的AppDomain中。这是一种合理的方法吗?有什么好的示例代码可以推荐吗?

3 个答案:

答案 0 :(得分:2)

您还可以尝试使用队列创建基于消息的应用程序。

然后,多个线程可以对请求进行排队,并且一个线程可以在此队列上工作,并通知其他线程有关结果的信息。 使用监视器类并不总是最快的方式。

AppDomains是一种选择。但是,您必须处理IPC。

答案 1 :(得分:0)

答案 2 :(得分:0)

Singleton只包含一个worker对象的实例,加上一个请求队列呢?