在.net框架中封装非线程安全代码的最佳方式是什么?为非线程安全代码构建工作线程池
我有一个第三方库,由于它使用静态变量而不是线程安全的。重写它不是一个选项。这个库被一个接收大量同时调用的asp.net web服务使用。
我目前得到它裹在使用锁来保证线程安全的代理类:
private static readonly object oneThreadAtATimePlease = new object();
public ISomething CalculateSomething(int someValue)
{
lock (oneThreadAtATimePlease)
{
return new UnsafeLibrary(someValue).DoSomething();
}
}
性能差,因为多个来电必须等待锁,但结果是正确的。
我想通过运行这个库的多个实例来提高性能,每个实例都在它自己的AppDomain中。这是一个合理的方法吗?任何好的示例代码推荐?
在我看来,您可能每次都会有相当多的开销重新实例化库 - 尤其是因为您正在锁内实例化它。实例化一次然后再引用该实例可能会更好。 – 2009-12-16 20:39:32
好点,匿名。不幸的是,因为构造函数设置了静态变量,所以需要为每次调用重新实例化库。我已经修改了上面的示例代码来反映这一点。 – 2009-12-16 21:08:15