【问题标题】:What is an efficient way of knowing when an external variable changes?知道外部变量何时发生变化的有效方法是什么?
【发布时间】:2014-08-18 21:51:55
【问题描述】:

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

【问题讨论】:

  • 如果你不能强制外部代码使用回调或事件,听起来你被卡住了:(
  • 顺便说一句,无需在标题中添加“更多信息”。我们将假设有更多信息,如果没有,请适当投票。
  • 不能让类库在变量改变值时触发事件?
  • @dbc 不,我已经尝试过了,但它是 COM 类库中的一个密封属性,我什至看不到它的内容(我几乎无法将它与它附带的糟糕文档一起使用)。

标签: c# wpf variables com notifications


【解决方案1】:

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

  • Pull - 您以特定的时间间隔提取值并在调用之间跟踪值。如果值已更改,则执行“值已更改”逻辑。

  • 推送 - 您告诉值的所有者让您知道值何时发生更改。您还可以告诉所有者您希望如何收到通知。然后,所有者将在值发生更改时向您推送通知,通常为您调用“值已更改”逻辑。

您当前正在使用 pull 方法,并且您认为它的效率低于 push 方法是正确的。但是,由于您的代码无法拦截对目标变量的写入,因此您几乎可以执行所有操作。

仔细检查 API 以确保没有列出与您感兴趣的变量相关的某种“回调”或“事件”。如果有,那么您可能可以挂接到库中然后在值更改时推送通知。

如果没有办法让库将更改推送到您的代码,那么您只需要决定您希望多久轮询一次值。如果执行拉取的成本不高,那么我会说您当前的 250 毫秒应该足够响应,让您的用户感觉值正在实时更新。

进一步阅读:

How do server-client push/pull connections work?

Data-Pull Model and Data-Push Model

【讨论】:

  • 感谢您的详细解答。我有一些想法,获得通知的唯一方法是使用属性回调或事件,或者直接检查值,但您的推/拉解释使它更清晰。
猜你喜欢
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2014-09-02
  • 2015-05-31
  • 1970-01-01
相关资源
最近更新 更多