首页 新闻 会员 周边 捐助

很疑惑的事情:用SqlDependency监视SQLServer的某张表,这个为什么没有出现无限循环?

0
悬赏园豆:10 [已关闭问题] 关闭于 2016-08-12 14:16
using System;  
using System.Configuration;  
using System.Data;  
using System.Data.SqlClient;  
  
namespace SqlDependencyTest  
{  
    class Program  
    {  
        private static string _connStr;  
  
        static void Main(string[] args)  
        {  
            _connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ToString();  
            SqlDependency.Start(_connStr);//传入连接字符串,启动基于数据库的监听  
            UpdateGrid();  
  
            Console.Read();  
        }  
  
  
        private static void UpdateGrid()  
        {  
            using (SqlConnection connection = new SqlConnection(_connStr))  
            {  
                //依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]  
                using (SqlCommand command = new SqlCommand("select ID,UserID,[Message] From [dbo].[Messages]", connection))  
                {  
                    command.CommandType = CommandType.Text;  
                    connection.Open();  
                    SqlDependency dependency = new SqlDependency(command);  
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);  
  
                   SqlDataReader sdr = command.ExecuteReader();  
                   Console.WriteLine();  
                   while (sdr.Read())  
                   {  
                       Console.WriteLine("Id:{0}\tUserId:{1}\tMessage:{2}",sdr["ID"].ToString(), sdr["UserId"].ToString(),   
  
sdr["Message"].ToString());  
                   }  
                   sdr.Close();  
                }  
            }  
        }  
  
  
        private static void dependency_OnChange(object sender, SqlNotificationEventArgs e)  
        {  
            UpdateGrid();  
        }  
    }  
}  

在网上看到最多的就是这份代码,很有一个疑惑,就是没有出现事件的无限循环?在UpdateGrid函数中dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);多增加一个监听事件,而事件又调用UpdateGrid然后又会增加这个事件。测试了一下居然没有出错?表示很疑惑。。。有时候这种事件触发再调用增加事件就会出现触发多次。

在另一个项目中,两个ComboBox为combobox1和combobox2,都增加SelectedIndexChanged事件,然后为了两个ComboBox同步,在1的SelectedIndexChanged事件中写上combobox2.SelectedIndex=combobox1.SelectedIndex,另一个SelectedIndexChanged事件中写combobox1.SelectedIndex=combobox2.SelectedIndex

当时我也很害怕出现事件无限循环,但是运行却也没有问题。。。这让我对事件产生了疑惑,到底什么情况才会出现无限循环,什么情况又不出现。。。。

小书丶的主页 小书丶 | 初学一级 | 园豆:154
提问于:2015-10-28 13:48
< >
分享
所有回答(1)
0

dependency 是临时变量~

waiter | 园豆:1000 (小虾三级) | 2015-10-28 16:49

并不是这个原因吧。写了一些代码,感觉像是利用command执行数据库然后就会插入消息队列,数据库有数据更新就会通知这个消息并从队列中移除。需要再执行一次数据库来重新插入一条消息。应该说是订阅,每次通过command订阅一次。但是下面的SelectedIndex我就不太清楚了

支持(0) 反对(0) 小书丶 | 园豆:154 (初学一级) | 2015-10-29 00:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册