c#asp.net等待db中的状态改变

时间:2012-07-12 10:05:59

标签: asp.net database asynchronous

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

2 个答案:

答案 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