为什么要不停的注册:
dep = new SqlDependency(cmd);
dep.OnChange += new OnChangeEventHandler(DependencyChanged);
每次在调用DependencyChanged时都得注册。
这样会使页面不断的刷新,浪费资源。有什么别的方法吗?
还是我在哪儿弄错了?
dep = new SqlDependency(cmd);
dep.OnChange += new OnChangeEventHandler(DependencyChanged);
每次在调用DependencyChanged时都得注册。
这样会使页面不断的刷新,浪费资源。有什么别的方法吗?
还是我在哪儿弄错了?
OnChange 事件不一定意味着数据发生了更改。在其他情况下,如超时时间已过和设置通知请求失败,也会生成 OnChange。
我看到UDP的异步消息机制的实现也差不多是这样做的,但是UDP可以做到只有数据包来的时候才发来事件。
是我在哪个地方用错了?
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();
}
}
}
/// <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;
}
}
}