如何检查Task线程是否被阻塞

本文关键字:是否 线程 Task 何检查 检查 | 更新日期: 2023-09-27 18:02:17

我有一个WebAPI web服务,它遇到了瓶颈,每当许多请求获得一个长时间运行的数据库操作时,所有其他请求都需要比正常情况下更长的时间才能完成。

web服务的每个端点如下所示:

            var result = await Task.Run(() =>
            {
                return _coordinator.GetValue(key);
            });
            return Request.CreateResponse(HttpStatusCode.OK, result);

其中_coordinator是通过构造函数注入的类,该构造函数将调用一个服务(非web服务),该服务将从数据库(长期运行)中获取数据。_coordinator可以调用几个长时间运行的服务调用,这些服务调用反过来将从数据库中获取。

从我的理解,任务。Run将创建一个任务,该任务将在线程池中的一个线程中运行。但我不确定这些线程在被释放时是否被阻塞了。

所以我想让线程运行协调器代码,看看它是否被阻塞,或者它是否被释放到线程池,直到机器服务返回。

如何检查Task线程是否被阻塞

由于GetValue()是一个同步方法,Task.Run()使用的ThreadPool线程将在该方法执行的整个过程中被使用。

如果你担心你的代码使用的线程数(因为你说你可以有许多并发请求,这是一个有效的担心),那么你应该使GetValue()真正异步。为此,您需要异步调用服务。具体如何做取决于您如何调用服务,但通常它涉及将foo.Bar()更改为await foo.BarAsync()


另外,因为你的代码是一个webservice,它已经运行在一个ThreadPool线程上,没有理由使用Task.Run()切换到另一个线程(然后使用await释放第一个线程)。