为什么要不停的注册:
dep   =   new   SqlDependency(cmd); 
 dep.OnChange   +=   new   OnChangeEventHandler(DependencyChanged);  
每次在调用DependencyChanged时都得注册。
这样会使页面不断的刷新,浪费资源。有什么别的方法吗?
还是我在哪儿弄错了?

解决方案 »

  1.   

    sqlDependency当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的
    OnChange 事件不一定意味着数据发生了更改。在其他情况下,如超时时间已过和设置通知请求失败,也会生成 OnChange。 
      

  2.   

    那么应该怎么做呢?
    我看到UDP的异步消息机制的实现也差不多是这样做的,但是UDP可以做到只有数据包来的时候才发来事件。
    是我在哪个地方用错了?
      

  3.   

    这是我用的代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    namespace SqlDependencyTest
    {
        public partial class Form1 : Form
        {
            //变量
            string connString = "";
            System.Data.SqlClient.SqlConnection conn = null;
            System.Data.SqlClient.SqlCommand command = null;
            public Form1()
            {
                InitializeComponent();
                connString = "user id=sa;password=qq111999;";
                connString += "initial catalog=My_dataBase;Server=WWW-742617824E7\\SQLEXPRESS;";
                connString += "Connect Timeout=2";
            }
            private void sqlDependency_OnChange(object sender, SqlNotificationEventArgs e)
            {
                //因为是子线程,需要用invoke方法更新ui
                System.Console.WriteLine("sqlDependency_OnChange");
                if (this.InvokeRequired )
                {
                    System.Console.WriteLine("if (this.InvokeRequired)");
                    this.Invoke(new OnChangeEventHandler(sqlDependency_OnChange), new object[] { sender, e });
                }
                else
                {
                    SqlDependency dependency = (SqlDependency)sender;
                    dependency.OnChange -= sqlDependency_OnChange;
                    //通知之后,当前dependency失效,需要重新getdata并且设置通知               
                    GetData();
                    System.Console.WriteLine("GetData");
                }
            }        
            private void GetData()
            {
                command.Notification = null;//清除
                SqlDependency dependency = new SqlDependency(command);//设置通知
                dependency.OnChange += new OnChangeEventHandler(sqlDependency_OnChange);//通知事件
                SqlDependency.Start(connString);
                using (SqlDataAdapter adapter = new SqlDataAdapter(command)) //查询数据
                {
                    
                    System.Data.DataSet ds = new DataSet();
                    adapter.Fill(ds, 0, 3, "test");
                    dataGridView1.DataSource = ds.Tables["test"];
                }        }
            
            private void Form1_Load(object sender, EventArgs e)
            {
                conn = new System.Data.SqlClient.SqlConnection(connString);
                command = conn.CreateCommand();
                command.CommandText = "select id from mytable; ";            SqlDependency.Start(connString);//启动
                     
                GetData();//获取数据            //dowork();
            }        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                //清理现场
                SqlDependency.Stop(connString);
                conn.Close();
                conn.Dispose();
            }
        }
      
    }
      

  4.   

    这是UDP的实现:
            /// <summary>
            /// 在后台运行的接收线程
            /// </summary>
            private void ReceiveData()
            {
                receiveUdpClient = new UdpClient(port);
                //监听所有端口发送过来的UDP信息;
                IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);
                while (true)
                {
                    try
                    {
                        //关闭udpClient时此句会产生异常
                        byte[] bytes = receiveUdpClient.Receive(ref remote);
                        string str = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
                        AddListBoxItem(listBoxReceive, string.Format("来自{0}:{1}", remote, str));
                        string sendString = "我已经收到你发的信息";
                        if (remote.Address.ToString() != myIP.ToString())
                        {
                            byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(sendString);
                            IPEndPoint remoteIPEndPoint = new IPEndPoint(remote.Address, port);
                            receiveUdpClient.Send(sendBytes, sendBytes.Length, remoteIPEndPoint);
                        }
                    }
                    catch
                    {
                        //退出循环,结束线程
                        break;
                    }
                }
            }
      

  5.   

    客户端界面不停的闪  不停的触发onchange事件 导致不停的执行sqlDependency_OnChange 方法里的代码
      

  6.   

    请问如果数据库连接突然中断,SqlDependency会如何处理呢?