c#asp.net正在等待数据库中的状态更改
我正在构建一个web应用程序,其中用户提交的作业由后台服务处理,web应用程序和后台服务之间的通信在数据库上完成。因此,当搜索开始时,web应用程序会将一条记录插入数据库,并等待记录的状态字段发生更改。据我所知,如果我在请求线程上实现这一点,我会不必要地阻塞其中一个池线程,但我无法集中精力异步执行此操作。这种情况下的最佳做法是什么?如果使用SQL Server作为数据库,则可以使用名为SQLDependency的ADO.NET功能 当设置正确时,当表(您将配置)发生更改时,将引发一个C#事件。 这里有一篇文章对此作了解释 注意:您必须设置SQL server才能启用此功能 这一部分说明了在表中的数据发生更改后如何刷新页面c#asp.net正在等待数据库中的状态更改,asp.net,database,asynchronous,Asp.net,Database,Asynchronous,我正在构建一个web应用程序,其中用户提交的作业由后台服务处理,web应用程序和后台服务之间的通信在数据库上完成。因此,当搜索开始时,web应用程序会将一条记录插入数据库,并等待记录的状态字段发生更改。据我所知,如果我在请求线程上实现这一点,我会不必要地阻塞其中一个池线程,但我无法集中精力异步执行此操作。这种情况下的最佳做法是什么?如果使用SQL Server作为数据库,则可以使用名为SQLDependency的ADO.NET功能 当设置正确时,当表(您将配置)发生更改时,将引发一个C#事件。
SQLDependency非常有用,但在服务器端,它只提供了一半的解决方案。通过使用signer向客户机发出查询结束的信号,我克服了另一半问题。最后,这是一个相当有效和优雅的解决方案。谢谢你的信息
public class KYHub : Hub
{
void OnChange(object sender, SqlNotificationEventArgs e)
{
SqlDependency dependency = sender as SqlDependency;
dependency.OnChange -= OnChange;
if (e.Info != SqlNotificationInfo.Error && e.Info != SqlNotificationInfo.Delete)
{
string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["cnnStr"].ConnectionString;
SqlConnection conn = new SqlConnection(connstr);
conn.Open();
SearchResult result= SearchResult.Parse(conn, Caller.TaskID);
conn.Close();
Caller.endsearch(result);
}
}
public void Search(SearchParam search)
{
string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["cnnStr"].ConnectionString;
SqlConnection conn = new SqlConnection(connstr);
conn.Open();
search.ClientID = Caller.id;
int QueryID = search.Save(conn);
Caller.TaskID = QueryID;
SqlCommand cmd = new SqlCommand(String.Format("SELECT Completed FROM dbo.Tasks WHERE TaskID={0}", QueryID), conn);
SqlDependency dep = new SqlDependency(cmd);
dep.OnChange += OnChange;
cmd.ExecuteReader();
conn.Close();
}
}
您是否可以在其中放置一个“加载”占位符,并使用javascript/ajax每5…10…15…30秒查询一个服务(无论对您的用例/预期负载有何意义),以查看结果何时就绪,然后将用户重定向到结果页/刷新页面?感谢您分享您的解决方案。现在就尝试了解一下这一点,以及其他文档建议调用
SqlDependency.Start(m_ConnectionString)代码>是必需的。你把这个放在哪里了,还是不需要这个?很抱歉回复太晚,我在Global.asax中调用了SqlDependency.start