为了账号安全,请及时绑定邮箱和手机立即绑定

为什么此异步操作挂起?

为什么此异步操作挂起?

C#
拉莫斯之舞 2019-10-17 10:09:21
我有一个多层.Net 4.5应用程序,它使用C#的new async和await挂起的关键字来调用方法,但我不知道为什么。在底部,我有一个异步方法来扩展我们的数据库实用程序OurDBConn(基本上是基础DBConnection和DBCommand对象的包装器):public static async Task<T> ExecuteAsync<T>(this OurDBConn dataSource, Func<OurDBConn, T> function){    string connectionString = dataSource.ConnectionString;    // Start the SQL and pass back to the caller until finished    T result = await Task.Run(        () =>        {            // Copy the SQL connection so that we don't get two commands running at the same time on the same open connection            using (var ds = new OurDBConn(connectionString))            {                return function(ds);            }        });    return result;}然后,我有一个中级异步方法,调用此方法可获得一些运行缓慢的总数:public static async Task<ResultClass> GetTotalAsync( ... ){    var result = await this.DBConnection.ExecuteAsync<ResultClass>(        ds => ds.Execute("select slow running data into result"));    return result;}最后,我有一个同步运行的UI方法(MVC操作):Task<ResultClass> asyncTask = midLevelClass.GetTotalAsync(...);// do other stuff that takes a few secondsResultClass slowTotal = asyncTask.Result;问题在于它永远挂在最后一行。如果我打电话,它做同样的事情asyncTask.Wait()。如果我直接运行慢速SQL方法,则大约需要4秒钟。我期望的行为是,当到达时asyncTask.Result,如果尚未完成,则应等待直到它到达,一旦返回,则应返回结果。如果我逐步使用调试器,则SQL语句将完成并且lambda函数将完成,但是永远不会到达该return result;行GetTotalAsync。知道我在做什么错吗?对我需要调查以解决此问题的任何建议?难道这是某个地方的僵局,如果有的话,有什么直接的方法可以找到它吗?
查看完整描述

3 回答

  • 3 回答
  • 0 关注
  • 498 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信