C# 如何检查任务线程是否被阻止

C# 如何检查任务线程是否被阻止,c#,multithreading,asp.net-web-api,task-parallel-library,C#,Multithreading,Asp.net Web Api,Task Parallel Library,我有一个WebAPI webservice正在遇到瓶颈,每当有许多请求需要获得一个长期运行的数据库操作时,所有其他请求都需要比正常情况更长的时间才能完成 webservice的每个端点如下所示: var result = await Task.Run(() => { return _coordinator.GetValue(key); }); return Re

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

webservice的每个端点如下所示:

            var result = await Task.Run(() =>
            {
                return _coordinator.GetValue(key);
            });

            return Request.CreateResponse(HttpStatusCode.OK, result);
其中_coordinator是通过调用服务(非web服务)的构造函数注入的类,该服务将从数据库中获取数据(长期运行)_协调器可以调用几个长时间运行的服务调用,这些服务调用将从数据库中获取

据我所知,Task.Run将创建一个任务,该任务将在线程池中的线程中运行。但我不确定这些线程是否在释放时被阻塞

因此,我想让线程运行协调器代码,并查看它是否被阻止或是否被释放到线程池,直到机器服务返回。

由于
GetValue()
是一个同步方法,因此
Task.Run()使用的线程池线程将在该方法执行的整个时间内使用

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



此外,由于您的代码是一个Web服务,它已经在线程池线程上运行,因此没有理由使用
Task.Run()
切换到另一个线程(然后使用
wait
释放第一个线程)。

线程是一个充足的资源。您不太可能受到线程数量的限制。听起来你的数据库只是超载了。优化查询。
\u coordinator是第三方还是您自己的?\u coordinator是我们自己的类。这是一个通行证。它调用中间件服务从Oracle数据库获取数据。是否为
GetValue()
async?换句话说,它的返回类型是什么?@svick,它不是异步的,它从数据库返回一个数据模型。我们谈论的是数千个并发连接。