我正在編寫一個程序來測試WCF服務在高併發情況下的性能。我如何知道有多少客戶正在呼叫我的WCF服務功能
在客戶端,我啓動了很多線程來調用一個WCF服務函數,該函數返回一長串數據對象。
在服務器端,在我的客戶端調用的函數中,我需要知道調用該函數的客戶端的數量。
爲此,我設置了一個計數器變量。在功能開始時,我將計數器加1,但如何在函數返回結果後減少它?
int clientCount=0;
public DataObject[] GetData()
{
Interlocked.Increment(ref clientCount);
List<DataObject> result = MockDb.GetData();
return result.ToArray();
Interlocked.Decrement(ref clientCount); //can't run to here...
}
我在C++中看到了一種方法。
創建一個名爲counter的新類。
在計數器類的構造函數中,增加變量。 並在析構函數中減少它。
在函數中,創建一個計數器對象,以便調用其構造函數。 函數返回後,將調用其析構函數。
像這樣:
class counter
{
public:
counter(){++clientCount; /* not simply like this, need to be atomic*/}
~counter(){--clientCount; /* not simply like this, need to be atomic*/}
};
...
myfunction()
{
counter c;
//do something
return something;
}
在C#我想我可以用下面的代碼這樣做,但不能肯定。
public class Service1 : IService1
{
static int clientCount = 0;
private class ClientCounter : IDisposable
{
public ClientCounter()
{
Interlocked.Increment(ref clientCount);
}
public void Dispose()
{
Interlocked.Decrement(ref clientCount);
}
}
public DataObject[] GetData()
{
using (ClientCounter counter = new ClientCounter())
{
List<DataObject> result = MockDb.GetData();
return result.ToArray();
}
}
}
我寫了一個計數器類實現IDisposable的接口。 並使用塊將我的功能代碼放入。 但它似乎不起作用。 無論我啓動多少個線程,clientCount變量都遠小於線程數。
任何意見,將不勝感激。
謝謝,我會試試看。 – ZhengZhiren 2010-05-18 02:58:24