最佳实践?等到收到或提出接收事件

时间:2010-10-26 13:53:44

标签: c# design-patterns microcontroller

首先,我要感谢社区。你最近得到了很大的支持!通常我甚至不需要问问题,因为他们已经在那里了。现在我遇到的问题与代码没有直接关系,而是编程本身。

我正在使用FTDI芯片和C#编程通信协议,其中PC应用程序就像Master(将发送请求),还有Slave设备将回答它们,而不是立即,可能是几个毫秒,但无论如何,将需要一些时间。我陷入了概念/哲学代码设计问题。

发送请求后,我应该立即询问答案(检查超时)还是应该持续监控输入(BackgroundWorker供电)并在收到数据输入后发出事件?你会推荐什么,你的经验是什么。我应该考虑哪些因素来做出选择?

我从未研究过编程本身的软件设计,所以我认为我缺乏基础,但这是一个我正在研究的个人项目,并且我确实会喜欢你们的一些反馈/指示。

谢谢!

2 个答案:

答案 0 :(得分:0)

在这种情况下,我首选的解决方案是以异步模式发出请求(这样您将在完成时触发的事件回调),并使用标准.Net机制实现异步超时你回来,如果看起来奴隶没有反应。这样你就可以启动请求和计时器,然后继续做更​​多的工作,而不需要任何其他线程来处理结果。

您必须确保使用锁定机制干净地处理并发超时和响应到达,以便确定您是否超时或处理响应。

尝试避免轮询和输入监视,除非您的slave的API不允许确定性地生成响应事件。

答案 1 :(得分:0)

通常我会在低级别站点上使用异步方法,并且可能会在此基础上设置一些同步机制。以下是一些示例方法,如果您获取数据片段,并且必须将这些片段放在一起以形成整个消息。

因此,在低级别站点上实现一个BackgroundWorker,它会不断检查传入的数据,如果你有什么东西并将其放入事件中,则会引发某种事件。

上面是有人在监听传入数据的事件并将所有这些(可能)片段放入内部队列。在那里它检查它是否已经有足够的数据用于完整的消息,可能会进行一些错误检查等。如果它有一个完整的消息,它将引发一个事件,将此消息发送给那里的所有听众。

除此之外,另一个类会监视消息并对它们做出反应。这个类可能实现了一些同步机制,以观察传入的消息是否与事先发生的事情匹配。

我认为这种设计可以更轻松地对您不期待某些内容时出现的数据做出反应。当您想要关闭时,您不必等待任何超时发生(可能是一个非常小的低级BackgroundWorker用于从不支持事件机制的源中提取数据)。