2009-12-16 115 views
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中。这是一个合理的方法吗?任何好的示例代码推荐?

+0

在我看来,您可能每次都会有相当多的开销重新实例化库 - 尤其是因为您正在锁内实例化它。实例化一次然后再引用该实例可能会更好。 – 2009-12-16 20:39:32

+0

好点,匿名。不幸的是,因为构造函数设置了静态变量,所以需要为每次调用重新实例化库。我已经修改了上面的示例代码来反映这一点。 – 2009-12-16 21:08:15

回答

2

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

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

AppDomains是一个选项。但是,你将不得不与IPC打交道。

0

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