【发布时间】:2016-10-27 11:57:13
【问题描述】:
我有一个 HID 设备,我正在以大约 200hz-600hz 的频率与之通信,并将数据解释为代表 HID 设备属性的类对象。该类在其属性上实现了 INotifyPropertyChanged,由于通信速度的原因,我认为处理队列正在陷入困境,因为几分钟后控件似乎变得迟缓和“框架”。
.net 中是否存在可能有助于解决此类问题的方法,比如事件处理程序池或某种队列?
不幸的是,没有我的 HID 设备,我不确定我的代码是否对任何人都可以复制,但我将包含几个相关的 sn-ps 来展示我的实现:
public enum DataEvents { onNone = 0, onStatus = 1, onInput = 2, onOutput = 4, onReport = 8};
public class Controller: INotifyPropertyChanged, IDisposable, INotifyDisposed
{
public event PropertyChangedEventHandler PropertyChanged;
public event EventHandler Disposing;
public event EventHandler Disposed;
public event EventHandler ReportReceived;
internal void callPropertyChanged(string PropertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
}
internal void callReportReceived()
{
ReportReceived?.Invoke(this, EventArgs.Empty);
}
public bool Touch1
{
get { return _Touch1; }
private set { if (value != _Touch1) { _Touch1 = value; if (RaiseUpdateEvents.HasFlag(DataEvents.onInput)) callPropertyChanged("Touch1"); } }
}
private bool _Touch1 = false;
//There are many more properties but all of them follow this pattern, and have several different types
}
我的对象是从一个循环中的System.Threading.Thread 填充的,该循环轮询 HID 设备以获取报告,HID 设备读取方法是一个阻塞调用,因此该循环不是死循环,并且受限于设备的数据速率,如通常所说的 200hz-600hz。
编辑:值得注意的是,我对 WPF 绑定特别感兴趣。
【问题讨论】:
-
如果这是 Wpf,您将导致调度程序积压。减少活动的频率
-
@Gusdor 好吧,当 HID 设备属性更改时会引发该事件,那么我将如何缓解这种情况
-
@Gusdor 我正在考虑为每个属性设置一个队列,如果为一个属性引发多个事件,它将清除除最新事件之外的所有事件,但我看不出这不会增加延迟和延迟,尤其是在这些速度。
-
与其直接在由 HID 更新的对象上使用 INotifyPropertyChanged,不如设置一个合理速率的 DispatcherTimer(可能每 100 毫秒左右滴答一次)。当它滴答作响时,读取对象的属性,并使用它来更新将绑定到 UI 的另一个对象。
-
@Wobbles, unmanaged 在 .Net 生态系统的上下文中意味着您正在使用在 CLR 之外执行的本机库。为 .Net 编译的任何 .Net 库都是托管的。在这种情况下使用这个词来描述其他任何东西都是令人困惑的。请不要。
标签: c# wpf inotifypropertychanged