【问题标题】:HttpClient ReadAsAsync<IQueryable<T>> never returnsHttpClient ReadAsAsync<IQueryable<T>> 永远不会返回
【发布时间】:2016-06-16 11:13:17
【问题描述】:

我对为 asp.net 编写控制器非常陌生,并且我试图返回 IQueryable,但我似乎无法获得返回内容的调用。

这是我的控制器:

    // GET: api/RumsaRooms
    [EnableQuery]
    public IQueryable<RumsaRoom> GetRooms()
    {
        return db.Rooms;

    }

这是我的客户电话:

    public async Task<IQueryable<T>> GetAllOf<T>()
    {
        var typeName = typeof(T).Name;



        var result = await _client.GetAsync($"api/{typeName}");

        if (!result.IsSuccessStatusCode)
        {
            var exception = await result.Content.ReadAsStringAsync();


        }
        //This method never returns
        var rooms = await result.Content.ReadAsAsync<IQueryable<T>>(); 

        return rooms;



    }

我在连接字符串中启用了多个活动结果集。 StatusCode 是 200。

GetAllOf() 方法如下所示:

    private async Task<bool> LoadEntities()
    {
        var rooms = (await _rumsaClient.GetAllOf<RumsaRoom>()).ToList();

        RoomsCollection = new ObservableCollection<RumsaRoom>(rooms);


        return true;
    }

LoadAllEntities 在我的视图模型的构造函数中被调用。 如果我将调用更改为此它可以工作:

var rooms = await result.Content.ReadAsAsync&lt;List&lt;T&gt;&gt;();

是否不能将 ReadAsAsync 读取到 IQueryable 中?

谢谢

埃里克

【问题讨论】:

    标签: c# entity-framework asp.net-web-api iqueryable


    【解决方案1】:

    您的问题几乎肯定在这段代码中:

    LoadAllEntities 在我的视图模型的构造函数中被调用。

    我在我的博客上详细解释了why this deadlock happens。它与ReadAsAsyncIQueryable 没有任何关系。它与在异步任务上调用 WaitResult 有关。

    总结:

    • async 方法返回的任务仅在该方法完成时完成。
    • await 默认捕获一个“上下文”并使用该“上下文”来恢复 async 方法。
    • 在 ASP.NET 上,此“上下文”是 AspNetSynchronizationContext 的一个实例,一次只允许一个线程进入。
    • 当代码调用Wait/Result时,会阻塞线程(仍在ASP.NET请求上下文中),等待任务完成。
    • await 准备好恢复该方法时,它会在捕获的上下文中这样做,并等待上下文空闲。
    • 由于await 在上下文空闲之前无法完成该方法,并且该上下文正被等待方法完成的线程使用,因此您最终会出现死锁。

    解决这个问题的正确方法是不要阻塞异步代码;请改用await。这个原则称为“async all the way”,在我的 MSDN 文章中关于异步最佳实践的描述。由于您尝试从构造函数调用异步代码,因此您可能还会发现我在 async constructors 上的博文很有帮助,其中解释了一些替代方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2019-11-15
      • 2011-07-25
      • 1970-01-01
      • 2012-10-02
      • 2013-02-18
      相关资源
      最近更新 更多