知道外部变量何时变化的有效方法是什么?
本文关键字:有效 方法 是什么 变化 外部 变量 何时 | 更新日期: 2023-09-27 18:18:46
我正在处理一个有2个项目的Visual Studio解决方案。一个主要的WPF项目,以及一个使用外部COM库的类库,通过更容易调用的方法简化了所有的代码。我试图保持代码分离,所以你可以说类库是一个工作项目,而我的主项目有所有的UI相关的代码。我的问题是在类库中使用变量时。
我在类库中有这个变量,它持有一个int=0,如果在我购买的扫描仪上按下一个物理按钮,该变量将变为1。我知道按钮是否被按下的唯一方法是检查变量属性,我需要一种方法来知道它何时发生变化。到目前为止,我唯一的想法是:
Thread backgroundThread = new Thread(() => {
while (variable == 0) {
// Do some work, if not;
thread.Sleep(250);
}
});
但这感觉效率低下,至少我是这么觉得的。如果我可以修改这个属性,我很想在Set方法中添加一些代码,以获得更改的通知,但由于这是一个外部COM库的属性,我无法控制它们。这是我唯一能做到的吗?
一般来说,有两种方法可以知道什么时候发生了变化:
-
Pull -您以特定的间隔拉取值并跟踪调用之间的值。
-
Push -告诉值的所有者当值发生变化时通知你。您还可以告诉所有者您希望如何收到通知。当值发生变化时,所有者会将通知推送给你,通常是通过调用你的"value changed"逻辑。
您目前正在使用pull方法,并且您认为它比push方法效率低是正确的。但是,由于您的代码无法拦截对目标变量的写入,因此您所能做的就是拉出。
仔细检查API,以确保没有列出与您感兴趣的变量相关的某种"Callback"或"Event"。如果有,那么你可以钩到那里的库,然后在值改变时推送通知。
如果没有办法让库将更改推送到你的代码中,那么你只需要决定你想要轮询值的频率。如果执行拉取的成本不高,那么我认为当前的250毫秒应该足够响应,让用户觉得值是实时更新的。
进一步阅读:
服务器-客户端push/pull连接如何工作?
数据拉模型和数据推模型