有没有办法验证没有线程阻塞

本文关键字:线程 验证 有没有 | 更新日期: 2023-09-27 18:33:16

如果我有一个方法:

    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。在这种情况下,这是不可取的。

我确实

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

有没有办法以某种方式检查各个点的工作线程计数,并验证线程是否在任何这些子任务中被阻止?

有没有办法验证没有线程阻塞

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

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