假设我正在编写一个模拟用户在系统上执行某些操作的软件。我正在测量使用秒表完成此类操作所需的时间。
大多数情况下,这是相当直接的:模拟按钮的点击,一些服务调用与此按钮相关联。测量此服务调用完成所需的时间。
现在问题出现了,有些行动有多个与之相关的服务电话。由于它们仍然是同一逻辑动作的一部分,我使用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提供的“分组”语义。
我为克服这个问题所做的是编写一个包装类(或者更确切地说是代码生成文件),它使用回调实现了一些计时机制,因为我对实际结果并不感兴趣(保存异常,这是统计数据的一部分),我只是让它返回一些统计数据。但事实证明这是一种性能消耗。
所以,基本上,我正在寻找这种方法的替代方案。也许这比我现在想的要简单得多,但我现在似乎无法自己解决这个问题。
答案 0 :(得分:1)
这似乎是Tasks
的主要候选者(假设您使用的是C#4)
您可以使用MSDN: Task.Factory.FromAsync
从APM方法创建Tasks
然后,您可以使用所有丰富的TPL善良,例如个人延续。
答案 1 :(得分:0)
如果您的需求足够简单,一种简单的方法就是单独记录每个服务呼叫,然后根据各个服务呼叫计算逻辑操作。
IE如果逻辑操作A由并行服务调用B和C组成,其中B花费2秒,C花费1秒,则A花费2秒。
A =最大(B,C)