了解外部变量何时发生变化的有效方法是什么?

时间:2014-08-18 21:51:55

标签: c# wpf variables com notifications

我正在处理一个包含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库的属性,我无法控制它们。这是我能做到的唯一方法吗?

1 个答案:

答案 0 :(得分:1)

一般来说,有两种方法可以知道什么时候发生了变化:

  • - 您以特定的时间间隔拉取值并跟踪调用之间的值。如果值已更改,则执行" Value Changed"逻辑。

  • 推送 - 您告诉值的所有者,以便在值发生更改时通知您。您还告诉所有者您希望如何收到通知。然后,所有者会在价值发生变化时将通知推送给您,通常是通过调用您的" Value Changed"你的逻辑。

您目前正在使用 pull 方法,并且您认为它的效率低于推送方法。但是,由于您的代码无法拦截对目标变量的写入,因此您只需要完成所有操作。

仔细检查API,确保没有某种" Callback"或"事件"列出的与您感兴趣的变量相关。如果存在,那么您可以在那里挂钩,然后推送有关值何时更改的通知。

如果没有办法让库将更改推送到您的代码,那么您只需要决定轮询该值的频率。如果执行拉动的成本不高,那么我说你当前的250毫秒应该足够响应,以便用户感觉价值正在实时更新。

进一步阅读:

How do server-client push/pull connections work?

Data-Pull Model and Data-Push Model