mikkkz 发表于 2010-7-16 17:40:10

C#中,如何用事件的方式响应一个变量的改变?一个爱着小蜜蜂的单思之人发出的一个简单的

这个监视变量的改变不是一个类中自己定义的,如果是自己定义的,在访问器中我也就可以定义响应事件了。这里说的是:
有一个类A,这个类A这个类是你不能改变的,比如是微软提供的类。即这个类的代码你无法修改。比如微软提供的WebBrowser类,TextBox类等,你不准修改。
在这个A类中有一个变量,比如是一个字符串变量kkk;

在你的程序中,你使用了这个类A生成了一个对象 a .
现在问题就是如何实现在对象a中的kkk产生变化时,执行你定义的一个方法(函数)void lll()。

jpchen 发表于 2010-7-16 19:19:57

我是不用C#用C++的人,提点建议:
1、首先查找这个类有没有可以监控你需要数据的回调函数,不过我估计十之八九没有的,否则楼主不会在这里问了。
2、采用一个笨的办法,就是你自己写个定时监控函数,去主动查询这个a对象里的这个kkk变量,如果有变化就咨询你的处理函数。如果你对响应时间要求不高,这个方法勉强可以用的。一般来说,每秒千次级别的查询,对系统性能影响不大的。

mikkkz 发表于 2010-7-16 19:53:14

回复【1楼】jpchen
我是不用c#用c++的人,提点建议:
1、首先查找这个类有没有可以监控你需要数据的回调函数,不过我估计十之八九没有的,否则楼主不会在这里问了。
2、采用一个笨的办法,就是你自己写个定时监控函数,去主动查询这个a对象里的这个kkk变量,如果有变化就咨询你的处理函数。如果你对响应时间要求不高,这个方法勉强可以用的。一般来说,每秒千次级别的查询,对系统性能影响不大的。
-----------------------------------------------------------------------

1.确实没有原生的提供此变量改动的事件回调方法代理.
2.在我的这个单线程程序上不允许那每秒几千次的代价(性能牺牲不是一点点,而是奇卡无比),而这个对变量变化的响应要求又较高.所以很棘手.

javenreal 发表于 2010-7-16 19:58:19

kkk既然会变化,那么极有可能是外部事件引起的,例如某个文本框内容被修改,例如数据库中某条记录被update。
这些源头都可以想办法的。

比如文本框可以用钩子、数据库可以用触发器。

mikkkz 发表于 2010-7-16 20:00:01

之所以用C#,就是因为有网络分布式的应用(WEB页面方式的管理分布于几个县的一大堆电路板).C#明显有优势,特别是后期维护与升级上.

mikkkz 发表于 2010-7-16 20:03:21

回复【3楼】javenreal
kkk既然会变化,那么极有可能是外部事件引起的,例如某个文本框内容被修改,例如数据库中某条记录被update。
这些源头都可以想办法的。
比如文本框可以用钩子、数据库可以用触发器。
-----------------------------------------------------------------------

数据库可以用触发器,但文本框用勾子勾到的只是典型的WIN消息,而这些消息基本都可以原生处理,这里不是文本框,而是第三方的类库.引发这个改变的确实有事件,但这个事件不足己让我的目标元素立马改变,而是不定时后的改变(网络因素).

henheng 发表于 2010-7-16 20:28:14

回复【楼主位】mikkkz我爱小蜜蜂
-----------------------------------------------------------------------

继承一下A类,然后自己写响应?

jpchen 发表于 2010-7-17 00:13:48

6楼的继承A类的方法好像是不能做到楼主的要求的,因为继承的类也无法做到出现变量变化时通知处理函数。

有个多线程的办法楼主可以尝试一下:
再创建一个线程,将你这个对象的指针传递进去(我不知道C#能否传递引用进去,但指针应该是可以的),在这个额外的线程里,你可以循环查询类A这个对象的kkk变量,注意每次查询后都延时一下,比如1毫秒,免得消耗太多CPU资源,当发行变量改变时,就调用处理函数,或者发个消息给你的主线程,让主线程来处理。发消息到主线程可以避免出现竞争现象,避免冲突。

改成多线程后,高频率的轮询就不会牺牲性能了,因为主线程不需要怎么变化。

C#好像缺省模式是不允许指针的,你要在设置里改成不安全模式,以便使用指针。当然如果能直接用引用的方法,就不需要改成不安全模式了。

这是我从C++方面的一些想法,供你参考,我想思路应该是相通的。

mikkkz 发表于 2010-7-17 11:41:28

谢谢楼上两位,用6楼的方式我想应可以解决了.还好这个类是可继承的.

讲一下思路:
继承A类生成B类,在B类中定义一新的和A类中的kkk为同一类型的元素JJJ,然后在JJJ的访问器set中同步kkk与JJJ,在JJJ变化时触发响应.
以这种方式应可以解决我在顶楼提出的问题.


同时,也是在单线程中解决的,避免了多开线程.
页: [1]
查看完整版本: C#中,如何用事件的方式响应一个变量的改变?一个爱着小蜜蜂的单思之人发出的一个简单的