gpt4 book ai didi

c# - WaitAll 构造中单个线程的性能测量

转载 作者:行者123 更新时间:2023-11-30 17:59:44 27 4
gpt4 key购买 nike

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

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

现在是症结所在,一些操作有不止一个与之关联的服务调用。因为它们仍然是同一逻辑操作的一部分,所以我使用 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 提供的“分组”语义的情况下完成每个方法所花费的时间。

我为克服这个问题所做的工作是编写一个包装类(或者更确切地说是一个代码生成文件),它使用回调实现了一些计时机制,因为我对实际结果不太感兴趣(保存异常,这是统计数据的一部分),我只是让它返回一些统计数据。但不知何故,这会导致性能下降。

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

最佳答案

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

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

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

关于c# - WaitAll 构造中单个线程的性能测量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10835897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com