Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#asp.net正在等待数据库中的状态更改_Asp.net_Database_Asynchronous - Fatal编程技术网

c#asp.net正在等待数据库中的状态更改

c#asp.net正在等待数据库中的状态更改,asp.net,database,asynchronous,Asp.net,Database,Asynchronous,我正在构建一个web应用程序,其中用户提交的作业由后台服务处理,web应用程序和后台服务之间的通信在数据库上完成。因此,当搜索开始时,web应用程序会将一条记录插入数据库,并等待记录的状态字段发生更改。据我所知,如果我在请求线程上实现这一点,我会不必要地阻塞其中一个池线程,但我无法集中精力异步执行此操作。这种情况下的最佳做法是什么?如果使用SQL Server作为数据库,则可以使用名为SQLDependency的ADO.NET功能 当设置正确时,当表(您将配置)发生更改时,将引发一个C#事件。

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

如果使用SQL Server作为数据库,则可以使用名为SQLDependency的ADO.NET功能

当设置正确时,当表(您将配置)发生更改时,将引发一个C#事件。 这里有一篇文章对此作了解释

注意:您必须设置SQL server才能启用此功能

这一部分说明了在表中的数据发生更改后如何刷新页面


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