Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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中的SqlDependency_C#_Asp.net_Sql Server_Domain Driven Design - Fatal编程技术网

C# ASP.NET中的SqlDependency

C# ASP.NET中的SqlDependency,c#,asp.net,sql-server,domain-driven-design,C#,Asp.net,Sql Server,Domain Driven Design,我在SQL依赖项对象上创建了以下封装: public class DependencyTracker { private SqlDependency _SQLDependency = null; public string ConnectionString { get; private set; } public string CommandNotifier { get; private set; }

我在SQL依赖项对象上创建了以下封装:

public class DependencyTracker
    {
        private SqlDependency _SQLDependency = null;

        public string ConnectionString
        { get; private set; }

        public string CommandNotifier
        { get; private set; }

        public delegate void Refresh();
        public event Refresh OnRefresh;

        public DependencyTracker(string connectionString, string commandNotifier)
        {
            ConnectionString = connectionString;
            CommandNotifier = commandNotifier;
        }

        public void StartDependency()
        {
            SqlDependency.Start(ConnectionString);
        }

        public void StopDependency()
        {
            SqlDependency.Stop(ConnectionString);
        }

        public void TrackForChanges()
        {
            using (SqlConnection sqlConn = new SqlConnection(ConnectionString))
            {
                sqlConn.Open();
                using (SqlCommand sqlCommand = new SqlCommand(CommandNotifier, sqlConn))
                {
                    sqlCommand.CommandType = CommandType.StoredProcedure;
                    _SQLDependency = new SqlDependency(sqlCommand);
                    _SQLDependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                    sqlCommand.ExecuteReader();
                }
            }
        }

        void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            SqlDependency sqlDependency = (SqlDependency)sender;
            sqlDependency.OnChange -= dependency_OnChange;

            if (OnRefresh != null)
            {
                OnRefresh();
            }
        }

        public bool HasChanges
        {
            get
            {
                return _SQLDependency.HasChanges;
            }
        }
    }
这不是原创作品,它基于我的存储库,我做了以下工作:

public bool Updatexxx(Ixxx xsxs)
        {
            try
            {
                SqlConnection sqlConn = new SqlConnection(_ConnectionString);
                sqlConn.Open();
                ...

                bool result = sqlComm.ExecuteNonQuery() == 1;

                _ResetEvent.WaitOne();

                return result;
            }
            catch ...
            catch ...
        }
回调是

public void RefreshData()
        {
            FindAllxxx();
            _ResetEvent.Set();
        }

public HashSet Finddadas()
{
DependencyTracker=_Container.Resolve(“数据”);
UnityHashSet哈希=_Container.Resolve(“Tdsadas”);
if(tracker.HasChanges | | hash.Count==0)
{
哈希=新的UnityHashSet(_容器);
ImportHashSet(findalldssnocached());
_容器注册状态(“dasda”,散列);
TrackForChanges();
}
返回散列;
}
findalxxnoncached()从数据库中进行实际选择。如你所见,我正在缓存所有内容。我的问题是为什么这不起作用。 症状:从dependecy tracker调用回调两次,然后阻塞。我实现了这一点,因为我的通知是在页面刷新开始后发出的。我尝试放置一个手动重置事件以提供通知机会,然后设置手动重置事件并刷新UI。正如我所说,经过两次OnChange之后,它冻结了。我能做什么?依赖项跟踪器是在Unity容器中注册的实例,存储库是类型注册的

void dependency_OnChange(object sender, SqlNotificationEventArgs e)
您需要检查SqlNotificationEventArgs,并查看您收到的通知、数据更改或其他内容。检查要安装的设备。检查要安装的设备。检查要安装的设备

最有可能的是,您的查询立即被告知它不符合。是的,我知道链接指向索引视图,如果您想了解原因,请阅读

您的更新等待_ResetEvent和回调信号_ResetEvent之间也存在竞争条件。T1调用更新。同时,数据中发生不相关的更新并调用回调_重置事件已设置。T1完成更新并等待发出信号的_ResteEvent,然后继续。调用者假定发生了对其自身更新的回调并刷新了缓存,但事实并非如此

第二个更严重的问题是,代码在存在事务时是不正确的。Updatexx假定其自身更新的回调将立即发生并等待它。查询通知将仅在更新提交后由引擎传递,因此当存在TransactionScope时,Updatexx方法将阻止等待通知,直到Updatexx返回(实时死锁)

也不清楚TrackForChanges的目的是什么。您正在读取SqlDataReader(sqlCommand.ExecuteReader),但忽略结果。使用查询通知,您可以提交一个查询,读取其结果,当结果发生更改时,您将收到通知


最后,.

是不是因为类型注册的存储库,而不是实例注册的存储库?顺便说一句,我在每个容器中设置了依赖跟踪程序的回调。1。与用于通知的查询相关,它们如下所示:从dbo.table.0中选择column1、column2、column3。感谢您提供有关SqlNotificationEventArgs.2的提示。关于事务,我可以假设它们不会出现在此应用程序中。尽管如此,问题仍然存在,感谢您指出这一点。我没有想到。再次感谢“从不读取SqlDependency通知回调中的数据”。这不是它应该如何工作的。读取数据,将其放入缓存,在收到通知时清除缓存。在缓存清除后的下一个请求中,再次读取数据。这就是缓存和通知的工作方式。
void dependency_OnChange(object sender, SqlNotificationEventArgs e)