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

时间:2013-09-27 21:34:12

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

如果我有方法:

    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。在这种情况下,这将是不受欢迎的。

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

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

1 个答案:

答案 0 :(得分:2)

您应该能够使用Microsoft Fakes(Ultimate only IIRC)或JustMock来捕获对Task.Factory.StartNew的呼叫。就个人而言,我认为这种努力不值得。

如果你不关心在代码中这样做,你可以(有点)使用Concurrency Visualizer(或PerfView)轻松地看到它。