无法在 SignalR 中将类型 'System.Threading.Tasks.Task<object>' 隐式转换为 'string'
Cannot implicitly convert type 'System.Threading.Tasks.Task<object>' to 'string' in SignalR
我是 SignalR 的新手。
我的项目是在 signalR 和 sql 依赖项上提出 sql 变化。
这是使用 C# corner
的示例代码
一切正常,但我通过此代码得到异常
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);
有什么想法吗?
不幸的是,您 post 编写的代码不完整且不够清晰,更不用说有用了。请注意,例如,作为实际代码 post 编辑的代码与您作为位图 post 编辑的代码实际上并不匹配。
(另请记住,位图,尤其是那些描述仍显示为 "enter image description here" 的位图,无法通过网站自己的搜索功能或搜索引擎等工具以任何有意义的方式进行搜索 Bing 和 Google).
但是,您得到的特定异常是非常典型的误用 async
方法。在我看来,您可以通过将 return 语句更改为如下所示来使代码正常工作:
return (string)context.Clients.All.RecevieNotification(commentCount).Result;
(这是您问题的文本版本中的代码...copy/paste 也比尝试从位图中重新键入内容更容易。我想您可以将上述更改调整为位图中的代码如果需要的话)。
请注意,如果这确实解决了问题,那么您真正应该 做的是将包含该 return 语句的方法更改为 async Task<string>
,并将 return 语句更改为:
return (string)(await context.Clients.All.RecevieNotification(commentCount));
但这样做只会将使用 await
的需要推回到调用方法和该方法的调用者,依此类推,直到您到达线程中的任何顶级方法或 UI 事件开始了整个过程。
确实是正确的做法,但这里没有足够的上下文来解释如何以任何特定方式做到这一点。如果您确实决定以这种方式修复您的代码,并且需要帮助弄清楚如何正确地使您的代码 async
-aware,请 post 一个新问题,确保包括 a good, minimal, complete code example清楚可靠地说明了这个问题。
我是 SignalR 的新手。
我的项目是在 signalR 和 sql 依赖项上提出 sql 变化。
这是使用 C# corner
的示例代码一切正常,但我通过此代码得到异常
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);
有什么想法吗?
不幸的是,您 post 编写的代码不完整且不够清晰,更不用说有用了。请注意,例如,作为实际代码 post 编辑的代码与您作为位图 post 编辑的代码实际上并不匹配。
(另请记住,位图,尤其是那些描述仍显示为 "enter image description here" 的位图,无法通过网站自己的搜索功能或搜索引擎等工具以任何有意义的方式进行搜索 Bing 和 Google).
但是,您得到的特定异常是非常典型的误用 async
方法。在我看来,您可以通过将 return 语句更改为如下所示来使代码正常工作:
return (string)context.Clients.All.RecevieNotification(commentCount).Result;
(这是您问题的文本版本中的代码...copy/paste 也比尝试从位图中重新键入内容更容易。我想您可以将上述更改调整为位图中的代码如果需要的话)。
请注意,如果这确实解决了问题,那么您真正应该 做的是将包含该 return 语句的方法更改为 async Task<string>
,并将 return 语句更改为:
return (string)(await context.Clients.All.RecevieNotification(commentCount));
但这样做只会将使用 await
的需要推回到调用方法和该方法的调用者,依此类推,直到您到达线程中的任何顶级方法或 UI 事件开始了整个过程。
确实是正确的做法,但这里没有足够的上下文来解释如何以任何特定方式做到这一点。如果您确实决定以这种方式修复您的代码,并且需要帮助弄清楚如何正确地使您的代码 async
-aware,请 post 一个新问题,确保包括 a good, minimal, complete code example清楚可靠地说明了这个问题。