在.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