3

假设我正在编写一个模拟用户在系统上执行某些操作的软件。我正在使用秒表测量完成此类操作所需的时间。

大多数情况下,这非常简单:模拟按钮的单击,一些服务调用与此按钮相关联。测量完成此服务调用所需的时间。

现在问题来了,一些操作有多个与之关联的服务调用。由于它们仍然是相同逻辑操作的一部分,因此我使用 C# 提供的信号机制将它们“分组”,如下所示(伪):

var syncResultList = new List<WaitHandle>();

var syncResultOne = service.BeginGetStuff();
var syncResultTwo = service.BeginDoOtherStuff();

syncResultList.Add(syncResultOne.AsyncWaitHandle); 
syncResultList.Add(syncResultTwo.AsyncWaitHandle);

WaitHandle.WaitAll(syncResultList.ToArray());

var retValOne = service.EndGetStuff(syncResultOne);
var retValTwo = service.EndDoOtherStuff(syncResultTwo);

因此,GetStuff 和 DoOtherStuff 构成了该特定操作的一项合乎逻辑的工作。而且,当然,我可以很容易地测量完成这种方法组合所需的时间,只需在它们周围放一个秒表。但是,我需要一种更细粒度的方法来处理我的统计数据。我真的对每个方法完成所需的时间量很感兴趣,而不会丢失 WaitHandle.WaitAll 提供的“分组”语义。

我为克服这个问题所做的是编写一个包装类(或者更确切地说是一个代码生成文件),它使用回调实现一些计时机制,因为我对实际结果不感兴趣(保存异常,这是一部分的统计数据),我只是让它返回一些统计数据。但这以某种方式被证明是一种性能消耗。

所以,基本上,我正在寻找这种方法的替代方案。也许它比我现在想的要简单得多,但我现在似乎无法自己弄清楚。

4

2 回答 2

1

Tasks这看起来像是(假设您使用的是 C# 4)的主要候选人

您可以Tasks使用 MSDN 从 APM 方法创建:Task.Factory.FromAsync

然后,您可以使用所有丰富的 TPL 优点,例如单个延续。

于 2012-05-31T15:19:25.323 回答
0

如果您的需求足够简单,一种简单的方法是单独记录每个服务调用,然后根据各个服务调用计算逻辑操作。

IE 如果逻辑操作 A 由并行服务调用 B 和 C 组成,其中 B 需要 2 秒,C 需要 1 秒,那么 A 需要 2 秒。

A = 最大值(B,C)

于 2012-05-31T23:59:16.177 回答