在.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 :(得分:2)
您还可以尝试使用队列创建基于消息的应用程序。
然后,多个线程可以对请求进行排队,并且一个线程可以在此队列上工作,并通知其他线程有关结果的信息。 使用监视器类并不总是最快的方式。
AppDomains是一种选择。但是,您必须处理IPC。
答案 1 :(得分:0)
答案 2 :(得分:0)
Singleton只包含一个worker对象的实例,加上一个请求队列呢?