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

sal*_*lar 3 c# signalr

我是 SignalR 的新手。

我的项目是在 signalR 和 sql 依赖项上提出 sql 更改。

这是使用C# 角的示例代码

一切都很好,但我通过这段代码得到了例外

在此处输入图片说明

         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);
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

Pet*_*iho 5

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

(还请记住,位图,尤其是那些描述仍为“在此处输入图像描述”的位图,无法通过网站自己的搜索功能等工具或 Bing 和 Google 等搜索引擎以任何有意义的方式进行搜索)。

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

return (string)context.Clients.All.RecevieNotification(commentCount).Result;
Run Code Online (Sandbox Code Playgroud)

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

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

return (string)(await context.Clients.All.RecevieNotification(commentCount));
Run Code Online (Sandbox Code Playgroud)

但是这样做只会将使用需求推await回到调用方法和该方法的调用者,等等,直到您到达线程中的任何顶级方法或 UI 事件启动了整个过程。

真的做正确的事情,但这里有没有足够的上下文来解释如何做,在任何特定的方式。如果您确实决定以这种方式修复您的代码,并且需要帮助弄清楚如何正确地使您的代码async感知,请发布一个新问题,确保包含一个好的、最小的完整的代码示例,该示例清楚可靠地说明了该问题.