2016-08-14 73 views
1

我有一個運行到瓶頸的WebAPI webservice,每當有很多請求獲得一個長時間運行的數據庫操作時,所有其他請求都會比正常時間更長。如何檢查任務線程是否被阻止

的web服務具有每個終點如下:

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

      return Request.CreateResponse(HttpStatusCode.OK, result); 

其中_coordinator被類通過構造,將調用一個服務(非web服務),將從數據庫讀取數據注射(長期運行)。 _coordinator可能會調用幾個長時間運行的服務調用,這些服務調用又會從數據庫中獲取。

從我的理解,Task.Run將創建一個任務,將在線程池中的線程中運行。但我不確定這些線程是否在被釋放時被阻塞。

所以我想讓線程運行協調器代碼,看看它是否被阻塞或者它是否被釋放到線程池直到機器服務返回。

+0

線程是一個充足的資源。你不太可能受到線程數量的限制。聽起來像你的數據庫只是超載。優化查詢。 – usr

+0

_coordiantor是第三方還是你自己的? –

+0

_coordinator是我們自己的班級。這是一個傳遞。它稱中間件服務從Oracle數據庫提取。 – abug

回答

2

由於GetValue()是一種同步方法,因此Task.Run()使用的ThreadPool線程將用於該方法執行的整個時間。

如果您擔心代碼使用的線程數量(既然您說可以有多個併發請求,這是一個有效的擔心),那麼您應該使GetValue()真正異步。爲此,您需要異步調用該服務。具體怎麼做取決於你打電話給該服務的方式,但通常需要將foo.Bar()更改爲await foo.BarAsync()


此外,由於你的代碼是一個Web服務,它是在一個線程池線程已經在運行,沒有理由使用Task.Run()切換到另一個線程(再使用await釋放第一個)。

相關問題