我正在构建一个Web应用程序,其中用户提交的作业由后台服务处理,Web应用程序和后台服务之间的通信在数据库上完成。因此,当搜索开始时,Web应用程序会将记录插入到数据库中并等待,直到记录的状态字段发生更改。据我所知,如果我在请求线程上实现这一点,我会不必要地阻塞其中一个池线程,但无法让我的头脑异步地执行此操作。在这种情况下,最佳做法是什么?
答案 0 :(得分:2)
SQLDependency非常有用,但在服务器端,它只提供了一半的解决方案。我通过使用SignalR向客户端发出查询结束信号来克服另一半。最后,它是一个非常有效和优雅的解决方案。感谢您的信息!
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();
}
}
答案 1 :(得分:0)
如果您使用SQL Server作为数据库,则可以使用名为SQLDependency的ADO.NET功能,
正确设置时的剂量是,当表格(您将配置)发生变化时,将引发C#事件。 这是一篇可以证明它的文章
注意:您必须设置SQL服务器才能启用此功能。
http://www.codeproject.com/Articles/12335/Using-SqlDependency-for-data-change-events
这个表示如何在表中的数据发生变化后刷新页面
http://msdn.microsoft.com/en-us/library/e3w8402y%28v=vs.80%29.aspx