【发布时间】:2009-12-16 20:31:38
【问题描述】:
在 .net 框架中封装非线程安全代码的最佳方式是什么?
我有一个第三方库,由于它使用静态变量,它不是线程安全的。重写它不是一种选择。该库由接收大量同时调用的 asp.net Web 服务使用。
我目前已经将它封装在一个使用锁来确保线程安全的代理类中:
private static readonly object oneThreadAtATimePlease = new object();
public ISomething CalculateSomething(int someValue)
{
lock (oneThreadAtATimePlease)
{
return new UnsafeLibrary(someValue).DoSomething();
}
}
性能很差,因为多个调用者必须等待锁定,但结果是正确的。
我想通过运行这个库的多个实例来提高性能,每个实例都在自己的 AppDomain 中。这是一个合理的方法吗?有什么好的示例代码可以推荐吗?
【问题讨论】:
-
在我看来,每次重新实例化库可能都会有相当多的开销 - 特别是因为您是在锁内实例化它。最好先实例化一次,然后再引用该实例。
-
好点,匿名。不幸的是,由于构造函数设置了静态变量,因此每次调用都需要重新实例化库。我已经修改了上面的示例代码以反映这一点。
标签: .net concurrency thread-safety appdomain worker-process