无法在SignalR中将类型'System.Threading.Tasks.Task <object>'隐式转换为'string'

时间:2015-07-11 18:07:52

标签: c# signalr

我是SignalR的新手。

我的项目是对signalR和sql依赖进行sql更改。

这是使用C# corner

的示例代码

每件事都没问题,但我通过这段代码获得了异常

enter image description here

         using (var connection = new SqlConnection("Server=.;Database=fidilio;Trusted_Connection=True;"))
        {
            const string query = "SELECT Count(*) FROM [dbo].[MemberComment]";

            connection.Open();
            using (var command = new SqlCommand(query, connection))
            {                  
                command.Notification = null;                
                var dt = new DataTable();
                var dependency = new SqlDependency(command);
                dependency.OnChange += dependency_OnChange;
                if (connection.State == ConnectionState.Closed)
                    connection.Open();                
                var reader = command.ExecuteScalar();

                commentCount = Int16.Parse((reader.ToString()));
            }  
        }
        var context = GlobalHost.ConnectionManager.GetHubContext<NotficationHub>();

        return context.Clients.All.RecevieNotification(commentCount);

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

不幸的是,您发布的代码不完整且远非清晰,从不介意有用。请注意,例如,作为实际代码发布的代码实际上与您作为位图发布的代码不匹配。

(另请注意,位图,特别是那些描述仍在阅读的位图&#34;此处输入图像描述&#34;,无法通过网站等工具以任何有意义的方式进行搜索自己的搜索功能或Bing和Google等搜索引擎。

但是,您获得的特定例外是非常典型的误用async方法。在我看来,您可以通过将return语句更改为以下内容来使代码工作:

return (string)context.Clients.All.RecevieNotification(commentCount).Result;

(那是您问题的文本版本中的代码...复制/粘贴比尝试从位图重新输入内容更容易。我认为您可以将上述更改调整为位图中的代码如果需要的话。)

请注意,如果这确实解决了问题,那么您真正应该做的是将包含该return语句的方法更改为async Task<string>,并将return语句更改为:

return (string)(await context.Clients.All.RecevieNotification(commentCount));

但这样做只会迫使需要使用await备份到调用方法,以及该方法的调用者,依此类推,直到你得到线程或UI中的任何顶级方法事件开始了整个过程。

确实是正确的事情,但这里没有足够的背景来解释如何以任何特定的方式做到这一点。如果您决定以这种方式修改代码,并需要帮助确定如何正确地使代码async - 知晓,请发布一个新问题,确保包含明确可靠地说明的a good, minimal, complete code example那个问题。