c# - 了解外部变量何时更改的有效方法是什么?

标签 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 库的属性,我无法控制它们。这是我能做到这一点的唯一方法吗?

最佳答案

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

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

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

您当前使用的是pull 方法,您认为它不如push 方法有效,这是对的。但是,由于您的代码无法拦截对目标变量的写入,因此您几乎只能执行拉取操作。

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

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

进一步阅读:

How do server-client push/pull connections work?

Data-Pull Model and Data-Push Model

关于c# - 了解外部变量何时更改的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25372615/

相关文章:

c# - 使用 WPD (Windows Portable Device) Apis 传输图像文件时出错

c# - 从 TTF 字体流创建 GlyphTypeface 对象

c# - C#中未分配变量的内存

javascript - 将本地存储变量名称设置为变量的值

c# - Windows Phone 8.1 加速计检测到震动

c# - 使用 IMAP 计算 gmail 中的电子邮件数量

c# - 触发并忘记异步等待调用

c# - 获取 WPF 数据网格上下文菜单单击行

c# - 我可以强制更新绑定(bind)到 ComboBox.SelectedItem 的 Textbox DataContext 吗?

c - 为什么指针起作用而不是这段代码中的普通变量?