gpt4 book ai didi

c# - 不使用 Task.Result 的异步/等待死锁

转载 作者:行者123 更新时间:2023-11-30 14:51:27 24 4
gpt4 key购买 nike

我有一个一直在使用 async/await 的 web api:

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。这样的代码还有可能死锁吗?当我调试这段代码时,我似乎正在经历一个,但对于我的生活,我无法弄清楚为什么。

我已经使用 Postman 发送了几个请求,但有时响应永远不会返回。如果我按下调试器中的暂停按钮,它将显示一条绿色的行,上面写着“这是当该线程从当前函数返回时要执行的下一条语句。”当我按下暂停按钮时,代码的位置并不一致,但似乎所有其他请求都会在其中一个被阻止后被阻止。

上面的代码会死锁吗?

最佳答案

SearchDocumentsAsync 中,您将立即从 SearchAsync 返回任务。

您应该等待此任务以确保 indexClientsearchClient 在操作完成之前不会被释放。这些被处置可能是引入死锁的原因。

关于c# - 不使用 Task.Result 的异步/等待死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34343189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com