2012-07-12 52 views
0

我正在构建一个Web应用程序,用户提交的作业由后台服务处理,Web应用程序和后台服务之间的通信在数据库上完成。因此,当搜索开始时,Web应用程序会将一条记录插入到数据库中,并等待记录的状态字段发生变化。据我所知,如果我在请求线程中实现这个功能,我会不必要地阻塞其中一个线程池线程,但无法让我的头部异步执行此操作。这种情况下的最佳做法是什么?c#asp.net等待数据库中的状态更改

+0

你可以把一个“加载”占位符,并使用javascript/ajax来查询服务每5 ... 10..15 ... 30秒(无论对你的用例/预期负载有意义)看看结果何时准备好,然后将用户重定向到结果页面/刷新页面? – 2012-07-12 11:59:14

回答

0

如果使用SQL Server作为您的数据库,那么你可以使用一个叫做的SqlDependency一个ADO.NET功能,

什么这个剂量时正确设置,当曾经有在表中的变化(你将配置)会引发一个C#事件。 这里是一篇文章,它扩大了它

注意:你将不得不设置你的SQL服务器来启用它。

http://www.codeproject.com/Articles/12335/Using-SqlDependency-for-data-change-events

而这一次expains后如何在表中的数据已经改变

http://msdn.microsoft.com/en-us/library/e3w8402y%28v=vs.80%29.aspx

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(); 
    } 
} 
+0

感谢您分享您的解决方案。试图了解这一点以及其他文档表明需要调用'SqlDependency.Start(m_ConnectionString);'。你把这个放在哪里?或者这不需要? – Ben 2013-11-18 17:00:30

+1

对不起,回复迟了,我把这个调用放到了Global.asax中的SqlDependency.start – IrmakA 2013-12-08 01:06:44

相关问题