2010-05-04 40 views
2

我正在編寫一個程序來測試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變量都遠小於線程數。

任何意見,將不勝感激。

回答

4

看看WCF使用的各個層。你可以插入其中之一。

例如添加IDispatchMessageInspector您EndpointBehavior:

public class ConsoleOutputMessageInspector : IDispatchMessageInspector 
{ 
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     Console.WriteLine("Starting call"); 
     // count++ here 
     return null; 
    } 

    public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     // count-- here 
     Console.WriteLine("Returning"); 
    } 
} 

查看更多在這裏:http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx

看一看如何在這裏擴展WCF: http://msdn.microsoft.com/en-us/magazine/cc163302.aspx#S6

+0

謝謝,我會試試看。 – ZhengZhiren 2010-05-18 02:58:24