我刚刚编写了一个小型 XBox 360 无线控制器托管接口,该接口基本上包裹了低级SlimDX包装器库,并为 XBOX 360 控制器提供了一个简单的托管 API。
在内部,该类每 N 毫秒轮询一次游戏手柄,并在检测到控制器底层状态的变化时触发事件。
我正在经历一些计时器的死胡同,这基本上迫使我在两个邪恶中取其较小的一个:
要么使我的 XBox360GamePad 类 UI 框架特定(即支持 WPF/WinForms 将被硬编码在类中,并且类必须引用这些框架......)
使类完全与框架无关,但强制用户使用 Dispatcher.Invoke / Invoke() 调用来散布他们的代码,以便能够根据生成的事件更新 UI。
如果我选择后一个选项(使代码 UI 不可知),那么我基本上使用“通用” System.Timers.Timer 或任何不依赖 UI 的计时器。在那种情况下,我最终会从无法直接更新 UI 的线程生成/调用事件,即在 WPF 中,我将不得不通过(丑陋的)使用 Dispatcher.Invoke 来发布源自 360 控制器类的每个更新.
另一方面,如果我在 XBox 360 Controller 类中使用 DispatcherTimer 我有一个工作组件可以直接更新 UI 而不会大惊小怪,但是现在我的整个控制器类都与 WPF 耦合,并且它不能在没有被使用的情况下使用依赖于 WPF(即在纯控制台应用程序中)
我正在寻找的是某种解决方案,它可以让我既不依赖于框架,又可以更新 UI,而无需求助于各种 Dispatcher.Invoke() 技术......例如,如果有一个共享的基础所有计时器的类,我可以根据相关场景以某种方式将计时器作为依赖项注入。有没有人成功处理过这类问题?