C# 我如何知道有多少客户端正在调用我的WCF服务功能
我正在编写一个程序来测试WCF服务在高并发环境下的性能 在客户端,我启动许多线程来调用WCF服务函数,该函数返回一长串数据对象 在服务器端,在我的客户机调用的函数中,我需要知道调用该函数的客户机的数量 为此,我设置了一个计数器变量。在函数的开头,我将计数器加了1,但是在函数返回结果后,如何减少计数器C# 我如何知道有多少客户端正在调用我的WCF服务功能,c#,wcf,multithreading,C#,Wcf,Multithreading,我正在编写一个程序来测试WCF服务在高并发环境下的性能 在客户端,我启动许多线程来调用WCF服务函数,该函数返回一长串数据对象 在服务器端,在我的客户机调用的函数中,我需要知道调用该函数的客户机的数量 为此,我设置了一个计数器变量。在函数的开头,我将计数器加了1,但是在函数返回结果后,如何减少计数器 int clientCount=0; public DataObject[] GetData() { Interlocked.Increment(ref clientCount);
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#中,我想我可以用以下代码来实现,但不确定
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();
}
}
}
公共类服务1:IService1
{
静态int clientCount=0;
私有类客户端计数器:IDisposable
{
公共客户端计数器()
{
联锁。增量(参考客户端计数);
}
公共空间处置()
{
联锁。减量(参考客户端计数);
}
}
公共数据对象[]获取数据()
{
使用(ClientCounter=new ClientCounter())
{
List result=MockDb.GetData();
返回result.ToArray();
}
}
}
我编写了一个计数器类来实现IDisposable接口。
并使用block将我的功能代码放入一个。
但它似乎不太管用。
无论启动多少线程,clientCount变量都远远小于线程数
任何建议都将不胜感激。看看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");
}
}
请参阅此处的更多信息:
在此处查看如何扩展WCF:
您是否尝试过WCF的内置性能计数器:
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");
}
}