【问题标题】:Is there a way to verify that no threads block? [duplicate]有没有办法验证没有线程阻塞? [复制]
【发布时间】:2013-09-28 05:48:22
【问题描述】:

如果我有方法:

    public async Task<string> Get()
    {
        Task<string> a = _db.GetSomething();
        Task<string> b = _db.GetSomethingElse();

        await Task.WhenAll(a, b);

        return a.Result + b.Result;
    }

我没有完全控制_db 中的代码,并且想要一种以编程方式验证它们是否在内部使用非阻塞io 的方法。是的,他们已经转换为基于Task 的api,但这可以通过Task.Factory.StartNew 轻松完成,并且仍然在下面使用阻塞IO。在这种情况下,这是不希望的。

我确实可以访问代码,所以我可以看到他们确实在内部使用了任务工厂,所以反编译并不是我真正想要的。理想情况下,我可以编写一个单元测试来验证前进的线程行为。

有没有一种方法可以检查各个点的工作线程计数,并验证这些子任务中的线程是否被阻塞?

【问题讨论】:

  • 单元测试别人的代码?为什么!?
  • 真的是一组内部库在拦截我的代码并做一些奇怪的事情。我正在尝试以一种程序化的方式来表明他们正在以不良方式改变行为。
  • 真的是测试我的代码是否具有一致的线程行为。如果我依赖的库改变了它们的行为,我想知道它。
  • 通常检测到超时
  • 我建议了一个副本,似乎可以解决您的问题。 TL;DR:应用负载并中断调试器。看看堆栈。

标签: c# multithreading task-parallel-library async-await


【解决方案1】:

您应该能够使用 Microsoft Fakes(仅限最终版 IIRC)或 JustMock 来捕获对 Task.Factory.StartNew 的调用。就个人而言,我认为这种努力是不值得的。

如果您不关心在代码中执行此操作,您可以(在某种程度上)使用并发可视化工具(或 PerfView)轻松查看它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2010-12-09
    • 2022-01-17
    • 2023-03-11
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多