Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何知道有多少客户端正在调用我的WCF服务功能_C#_Wcf_Multithreading - Fatal编程技术网

C# 我如何知道有多少客户端正在调用我的WCF服务功能

C# 我如何知道有多少客户端正在调用我的WCF服务功能,c#,wcf,multithreading,C#,Wcf,Multithreading,我正在编写一个程序来测试WCF服务在高并发环境下的性能 在客户端,我启动许多线程来调用WCF服务函数,该函数返回一长串数据对象 在服务器端,在我的客户机调用的函数中,我需要知道调用该函数的客户机的数量 为此,我设置了一个计数器变量。在函数的开头,我将计数器加了1,但是在函数返回结果后,如何减少计数器 int clientCount=0; public DataObject[] GetData() { Interlocked.Increment(ref clientCount);

我正在编写一个程序来测试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#中,我想我可以用以下代码来实现,但不确定

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");
    }
}