【发布时间】:2012-04-20 09:25:15
【问题描述】:
我目前正在构建一个 C# 应用程序,当用户连接到特定的无线网络时,它将自动针对特定网络资源对用户进行身份验证。
目前,我正在使用Managed Wifi API 来发现用户何时连接/断开无线网络。我有一个事件处理程序,因此当任何这些活动发生时,都会调用我的一个方法来检查无线连接的当前状态。
为了管理应用程序的状态,我有另一个称为“导体”的类,它执行更改应用程序状态所需的操作。例如,当无线网卡连接到正确的网络时,指挥需要将系统状态从“正在监控”更改为“正在验证”。如果身份验证成功,指挥者需要将状态更改为“已连接”。断开连接再次导致“监控”状态,身份验证错误导致“错误”状态。这些状态更改(如果用户请求)可能会导致 TrayIcon 通知,因此用户知道他们正在通过身份验证。
我目前的想法是让用于检查无线当前状态的方法调用状态管理器中的“身份验证”或“断开连接”方法。但是,我不确定这是否是对事件处理程序的适当使用——它是否应该设置一个标志或通过某种形式的 IPC 将消息发送到一个单独的线程,该线程将开始身份验证/断开连接过程?
除了能够请求连接/断开连接的事件处理程序之外,用户还可以通过托盘图标执行它。因此,我需要确保这些后台操作不会阻止托盘与用户的交互。
应该只有一个组件可以随时请求更改系统状态,因此我需要使用互斥锁来防止并发状态更改。但是,我应该如何同步这些组件的其余部分对我来说有点神秘。
任何我应该阅读的建议或文献都会受到欢迎。我没有接受过正式的 C# 语言培训,所以如果我陈述错误,我深表歉意。
编辑:最重要的是,我想验证一个事件将作为一个单独的线程执行,因此它不会阻塞主 UI。另外,我想验证如果我有一个事件处理程序订阅了一个事件,它会串行处理事件,而不是并行处理(所以如果用户在处理第一个连接事件之前连接和断开连接,则不会发生两次状态更改同时发生)。
【问题讨论】:
-
避免过度思考。只需生成一个事件并让您的 UI 通过禁用“连接”按钮来实现它。自动联锁和视觉反馈。
-
这里有几个链接供您参考。首先,为了同步一切,Rhino Service Bus 可能会有所帮助。 hibernatingrhinos.com/open-source/rhino-service-bus 其次,这是 .NET 中线程的一个很好的入门,从基础开始,扩展到高级主题:yoda.arachsys.com/csharp/threads/index.shtml
标签: c# events event-handling thread-safety state-machine