怎么才能知道一个服务函数正同时被多少个Client调用?

ZhengZhiRen 2010-05-03 05:55:32
我想测试WCF的并发性能,需要在一个WCF服务函数中获得当前该函数正被多少个客户调用。
如果像这样:

int clientCount=0;
public DataObject[] GetData()
{
Interlocked.Increment(ref clientCount);
List<DataObject> result = MockDb.GetData(); //查询数据
return result.ToArray();
Interlocked.Decrement(ref clientCount); //需要函数返回后再执行。。。不可能。。。
}

return之后的语句无法被执行,但确实在return之后才能减。

我想到c++中可以写一个类,在构造函数中执行加,在析构函数中执行减,这样当函数return后,对象超出作用域,自动析构。
但是C#对象是自动垃圾回收,无法保证析构在return后马上执行。
我又想到了IDisposable,写了下面代码:

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

我认为,函数一开始在using块中new一个对象,自动执行Interlocked.Increment(ref clientCount);
当return后,超出using块,执行Dispose()中的Interlocked.Decrement(ref clientCount);
但是,调试时总是有问题,不管我开多少客户线程,clientCount最多是3.
对IDisposable接口和using块理解不是十分深入,只是凭感觉,问题出在哪?
...全文
205 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
andy_liucj 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhengzhiren 的回复:]
我想测试WCF的并发性能,需要在一个WCF服务函数中获得当前该函数正被多少个客户调用。
如果像这样:

C# code

int clientCount=0;
public DataObject[] GetData()
{
Interlocked.Increment(ref clientCount);
List<Da……
[/Quote]

学习了
songfei5201314 2010-05-09
  • 打赏
  • 举报
回复
有项目开发管理经验的.NET的朋友加上限500人的QQ群28720769一起交流。
terrible12 2010-05-07
  • 打赏
  • 举报
回复
自定义事件吧
iyori 2010-05-06
  • 打赏
  • 举报
回复
当return后,超出using块,执行Dispose()中的Interlocked.Decrement(ref clientCount);
不一定执行dispose 吧
mayonglong 2010-05-06
  • 打赏
  • 举报
回复
xue xi ~
ZhengZhiRen 2010-05-05
  • 打赏
  • 举报
回复
各位好像不知道我在说什么
Justin-Liu 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ly302 的回复:]
以前有这么个帖子:

怎么知道自己写的c函数正在被那些函数调用?请说明方法。

其中有个回复是这样的,楼主可以参考一下思路:

我估计此题本意是,如何设计你的函数(called 函数和calling 函数),使得这个函数可以知道是谁在调用它, 这么做的目的是为了便于debug。

我的方法其实很简单,就是在每个函数的参数列表加上两个参数,一个是文件名,一个是行号, 如:
void……
[/Quote]
了解了解 甚对
风骑士之怒 2010-05-05
  • 打赏
  • 举报
回复
学习一下lss的方法
mark620 2010-05-05
  • 打赏
  • 举报
回复
恩 楼上所言有理。
皇城龙三 2010-05-03
  • 打赏
  • 举报
回复
以前有这么个帖子:

怎么知道自己写的c函数正在被那些函数调用?请说明方法。

其中有个回复是这样的,楼主可以参考一下思路:

我估计此题本意是,如何设计你的函数(called 函数和calling 函数),使得这个函数可以知道是谁在调用它, 这么做的目的是为了便于debug。

我的方法其实很简单,就是在每个函数的参数列表加上两个参数,一个是文件名,一个是行号, 如:
void myFunction1 (int var1, int var2, ... , char *file, int line )

然后在每个需要调用 myFunction1 的地方, 比如 myFunction2 内调用 myFunction1, 使用如下方式调用:
void myFunction2 () {
....
myFunction1(a, b, ... , __FILE__, __LINE__ ); // 调用时,编译器会自动把当前的文件名和行号填入作为参数。
....
}

这样在myFunction1 内就能*实时*的知道是那个函数在调用它,因为我们知道了文件名和行号,就可以唯一定位到某个函数内。

如我所述,这不一定是最好的方法,但起码可以达到目的。

12,163

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧