2009-12-16 102 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只包含一個工作對象實例和一個請求隊列呢?