我有一個使用異步網絡API /等待一路下跌:異步/ AWAIT僵局,而無需使用Task.Result
public class SampleController : ApiController
{
public async Task<IEnumerable<DocumentModel>> GetAll()
{
List<DocumentModel> modelItems = new List<DocumentModel>();
var response = await SearchDocumentsAsync();
var items = response.Results.ToList();
foreach(var document in documents)
{
var model = new DocumentModel()
{
Id = document.Id,
Name = document.Name
};
modelItems.Add(model);
}
return modelItems;
}
private Task<DocumentSearchResponse<Document>> SearchDocumentsAsync()
{
using (var searchClient = new SearchServiceClient(new SearchCredentials(searchServiceKey), searchServiceUri))
using (var indexClient = searchClient.Indexes.GetClient(indexName))
{
var parameters = new SearchParameters()
{
IncludeTotalResultCount = true
};
// call the Azure Search service
return indexClient.Documents.SearchAsync<Document>(search.Term, parameters);
}
}
}
我不是調用堆棧使用.Wait()
或.Result
任何地方。這樣的代碼是否仍然有可能死鎖?當我調試此代碼時,我似乎正在體驗一個,但對於我的生活,我無法弄清楚爲什麼。
我已經使用郵遞員發送了幾個請求,有時迴應永遠不會回來。如果我在調試器中按下暫停按鈕,它將顯示一行綠色的線條,表示「這是當此線程從當前函數返回時要執行的下一個語句。」當我按下暫停按鈕時,代碼的位置並不一致,但似乎只要其中一個請求被阻止,其他請求就會被阻止。
上面的代碼能否死鎖?
當您調試代碼時,執行何處停止?您還需要提供一個可以複製問題的完整示例,以便我們能夠提供解決方案。 – Servy
也就是說,死鎖可能是由很多事情造成的,同步阻塞同步上下文,而異步操作試圖發佈延續到它只是一種導致死鎖的方法。還有很多其他的。 – Servy
我提到它在停止的地方並不一致。我對上面的代碼更感興趣。上面的代碼中是否有任何事情會導致死鎖? – Dismissile