好吧,是时候在这里问我的第一个问题了……
我为它们创建了许多视图(CF 3.5 用户控件,使用 OpenNETCF.IoC 和 resco 控件)和导航控制器。
我还为一个非常奇怪的专有网络设备创建了一个抽象层(“驱动程序”)。命令只能在设备上同步执行,但我使用读取器线程来侦听来自设备的消息(可能随时出现,或响应同步命令)。这些消息可以在事件中分派或排队。
有点像这样,在“驱动程序”界面中:
public Response ExecuteCommand(Command command);
<= 这是同步调用。有些命令可能会运行几分钟。
public event DeviceMessageReceivedEvent;
<= 如果订阅了这个,传入的消息不是对上述方法的调用的直接回复,将在事件 args 中调度。这将从阅读器线程中调用。
public Queue DeviceMessages;
<= 如果未订阅该事件,则此类消息位于此处。
还有一个便利的应用程序外观,但它基本上只是 ExecuteCommand 调用的精美包装器,所以我将在此处省略它。
问题:
我如何最好地将在事件和/或队列中接收到的数据连接到视图,以及如何最好地在 ExecuteCommand 方法上实现异步包装器 - 重申一下,由于设备网络的限制,它必须同步运行协议(是的,这真的很糟糕。)
在阅读了相当多的 .NET CF 3.5 WinForms 异步编程之后,我不知道如何继续。在第一个演示中,我经常使用 DataBindings,但这导致了在需要时没有明显的方法来使用 Control.Invoke 的问题。我还通过仅与 UI 线程同步执行所有命令并使用匿名线程而不是使用事件轮询队列上的消息来解决异步执行问题。由于显而易见的原因,我非常想改变这一点。
CF 不提供 BeginInvoke 和 EndInvoke,但我想这些会很简单,可以重新实现吗?
我应该创建一个以视图为中心的静态模型吗?这甚至会简化问题吗?
我应该创建一个额外的“中间”线程来处理模型/视图和驱动程序之间的状态传输吗?这甚至会简化问题吗?
...?
我想我在这里寻找一些关于一般设计原则的头脑风暴。我从来都不是一个 UI 人,主要是在做系统编程,从来没有比我能避免的更多的 .NET。异步编程的概念很清楚,只是不知道如何在这种情况下应用它们。
所以..任何意见表示赞赏,还有书籍推荐等......