当前位置:  开发笔记 > 编程语言 > 正文

async/await deadlock而不使用Task.Result

如何解决《async/awaitdeadlock而不使用Task.Result》经验,为你挑选了1个好方法。

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

public class SampleController : ApiController
{
    public async Task> GetAll()
    {
        List modelItems = new List();

        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> 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(search.Term, parameters);
        }
    }    
}

我没有使用.Wait().Result在调用堆栈中的任何位置.像这样的代码仍然可能死锁吗?当我调试这段代码时,我似乎遇到了一个但是对于我的生活,我无法弄清楚为什么.

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

上面的代码可以死锁吗?



1> Cory Nelson..:

SearchDocumentsAsync,你立即返回任务SearchAsync.

在操作完成之前,您应该等待此任务以确保indexClient并且searchClient不处理.这些被处置可能是引入僵局的原因.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有