1

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

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

我目前已经将它包装在一个代理类中,该类使用锁来确保线程安全:

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

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

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

4

3 回答 3

2

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

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

AppDomains 是一个选项。但是,您将不得不处理 IPC。

于 2009-12-16T20:37:17.527 回答
0

静态构造函数将帮助您:

静态构造函数保证每个应用程序域只运行一次......

于 2009-12-16T20:37:01.597 回答
0

一个只包含一个工作对象实例和一个请求队列的单例呢?

于 2009-12-16T20:44:01.207 回答