C#拜求,局域网中A机器WINFORM程序更新了数据库的时候,B机器的WINFORM界面自动更新内容,要怎么样实现?

主要是我想在A机器更改了数据库的信息,B机器用来显示的。。我不知道如何实现。。求具体方法。。希望不要只发个socket,或者TIME。。触发器上来。。

如果你不希望用B机器去频繁的定时刷数据库的话,那我还是建议用UDP SOCKET来实现比较好,我之前做过一个活感觉跟你差不多。
流程是这样的,一台机器负责对数据库操作,10多个客户端需要同步数据。后来我的做法是,A机器执行完了数据库操作后,用UDP的方式往局域网类广播一个指令;其他机器监听某个端口,一旦接收到了该指令,就去读取一次数据库。追问

请问UDP SOCKET。。需要用到SQL的储存过程来触发吗?提交的网络广播指令怎样存储?

追答

UDP是在客户端自己定义事件触发的,和存储过程没关系的。
比如你点了一个按钮,修改了数据库数据,修改完了之后,用UdpClinet对象网局域网里的某个端口广播一个指令,如"update".
其他机器的客户端程序启动的时候需要监听一下某端口,这样当A机器广播了一个指令之后,各个客户端就都会收到update这个指令,然后都去查询一下数据库更新一下显示结果就行了。
代码我现在没有,晚上回去我可以发上来给你看看。现在你可以去研究一下c# 的udpclient类

追问

OK..非常感谢。。我下午都在看udpclient类。。觉得比较适合。。我等你哟。。
哈哈。。我测试的时候。发送指令测试无问题。。但是接收的界面死机。。而且不能够刷新。。

追答

不好意思啊,昨晚回去一忙把这事给忘了...
接收端监控某个端口的代码是个死循环,必须要放在后台里,定义一个线程,线程里启动这个死循环,然后把线程放到后台里,好像是isbackground的属性设置,否则程序肯定要挂了。
此外在循环体里一旦接收到数据,就调用一个委托事件,这样才能对界面上的控件进行操作。否则会报错的,.net 2005以上的版本线程内是无法对外部控件直接操作的,只能用委托的方法。

追问

private Thread messageAccectThread;

private void Form1_Load(object sender, EventArgs e)
{
BeginMessageAcceptor();
}
哈哈。。解决了。。非常感谢。。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-20
只能在B机器后台刷新数据。有变化,就刷新显示界面追问

呵呵。您的意思是否跟Timer差不多?B机器不知道A什么时候提交过数据,所以它不知道什么时候去后台刷新数据哟。。还不如手动刷新减轻数据库的负担。。对吧?

追答

你的程序数据库访问量有多大? 没什么负担就这么来吧,还简单。
backgroundWorker_DoWork
while (true)
{
System.Threading.Thread.Sleep(5000);
//do
}

追问

实在抱歉。。刚刚才从PHP转过来做C#有点菜。。我的程序是B机器打开程序之后就一直开着。。一直在监听数据库的变化从而更新显示的内容的。。。 backgroundWorker_DoWork 是在LOAD窗口的时候就开始循环后台刷新数据吗,当遇到变化才刷新界面,这样程序一直在后台操作会不会不好呢?如果要实现这种即时更新的效果,如果在A机器提交数据的时候向B机器发送触发数据是不是很麻烦?

追答

那样是有socket的吧。很麻烦。应该你的B机器是客户单机,现在的机器性能,不要在乎这个后台程序。实际上咱们程序界面的时钟不也是后台1秒刷新一次么。没什么的。而且,后台丢出去的线程你也不用考虑别的比如稳定和性能什么的,这个微软也把类做好了。

第2个回答  2012-03-21
其实这个用socket比较好,
触发器的原理其实也是相当于一个线程监听,
time也是一个线程,原理一样
相似回答