首页 > 解决方案 > UWP 应用服务线程模型

问题描述

我尝试开发基于原生消息传递的 Microsoft Edge 扩展,官方指南提供了示例。并且在方法中有访问AppServiceConnections和他们的字典的同步,但是在其他事件处理方法中没有这样的东西......DeferralsOnBackgroundActivated

所以我的问题是关于 UWP App Service 线程模型。是否保证一次只能执行一种事件处理方法?或者我应该提供对我的数据访问的正确同步?

AppServiceConnection线程安全吗?我可以SendMessageAsync同时使用不同的线程吗?或者我应该同步它的使用?

标签: c#uwpmicrosoft-edgemicrosoft-edge-extension

解决方案


我猜你的问题是你没有lock在事件中看到关键字OnAppServiceRequestReceivedOnAppServicesCanceled等等,这是做线程同步的,你不确定你是否应该自己做。

我认为答案应该是否定的。lock确保内部OnBackgroundActivated设置正确desktopBridgeConnectionIndexconnectionIndex。在这些事件句柄中没有关键字lock并不意味着事件句柄一次只能触发一次。对于一个应用服务,如果客户端 A 正在连接应用服务,同时另一个客户端 B 请求相同的应用服务,对于这种情况,应用服务将启动相同后台任务的另一个实例。这样对于客户端A来说,它的应用服务连接对客户端应用B没有副作用。换句话说,每个应用服务连接都有自己的实例,基于一个应用服务连接发送的消息对其他应用服务连接没有影响。你可以参考这个视频要查看有关应用服务的更多详细信息,应用服务相关是大约从第 25 分钟开始。

如果查看事件内部的代码片段,您可能会看到有代码行来判断请求来自哪个应用服务连接,例如this.desktopBridgeConnection = desktopBridgeConnections[this.currentConnectionIndex]。您将发送消息到正确AppServiceConnection的,这应该是线程安全的。如果您在执行此操作时遇到实际的线程保存问题,您可以询问有关测试详细信息的问题。


推荐阅读