我正在处理一个包含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库的属性,我无法控制它们。这是我能做到的唯一方法吗?
答案 0 :(得分:1)
一般来说,有两种方法可以知道什么时候发生了变化:
拉 - 您以特定的时间间隔拉取值并跟踪调用之间的值。如果值已更改,则执行" Value Changed"逻辑。
推送 - 您告诉值的所有者,以便在值发生更改时通知您。您还告诉所有者您希望如何收到通知。然后,所有者会在价值发生变化时将通知推送给您,通常是通过调用您的" Value Changed"你的逻辑。
您目前正在使用 pull 方法,并且您认为它的效率低于推送方法。但是,由于您的代码无法拦截对目标变量的写入,因此您只需要完成所有操作。
仔细检查API,确保没有某种" Callback"或"事件"列出的与您感兴趣的变量相关。如果存在,那么您可以在那里挂钩,然后推送有关值何时更改的通知。
如果没有办法让库将更改推送到您的代码,那么您只需要决定轮询该值的频率。如果执行拉动的成本不高,那么我说你当前的250毫秒应该足够响应,以便用户感觉价值正在实时更新。
进一步阅读: