c# - UWP 应用服务线程模型
问题描述
我尝试开发基于原生消息传递的 Microsoft Edge 扩展,官方指南提供了示例。并且在方法中有访问AppServiceConnections
和他们的字典的同步,但是在其他事件处理方法中没有这样的东西......Deferrals
OnBackgroundActivated
所以我的问题是关于 UWP App Service 线程模型。是否保证一次只能执行一种事件处理方法?或者我应该提供对我的数据访问的正确同步?
AppServiceConnection
线程安全吗?我可以SendMessageAsync
同时使用不同的线程吗?或者我应该同步它的使用?
解决方案
我猜你的问题是你没有lock
在事件中看到关键字OnAppServiceRequestReceived
,OnAppServicesCanceled
等等,这是做线程同步的,你不确定你是否应该自己做。
我认为答案应该是否定的。lock
确保内部OnBackgroundActivated
设置正确desktopBridgeConnectionIndex
或connectionIndex
。在这些事件句柄中没有关键字lock
并不意味着事件句柄一次只能触发一次。对于一个应用服务,如果客户端 A 正在连接应用服务,同时另一个客户端 B 请求相同的应用服务,对于这种情况,应用服务将启动相同后台任务的另一个实例。这样对于客户端A来说,它的应用服务连接对客户端应用B没有副作用。换句话说,每个应用服务连接都有自己的实例,基于一个应用服务连接发送的消息对其他应用服务连接没有影响。你可以参考这个视频要查看有关应用服务的更多详细信息,应用服务相关是大约从第 25 分钟开始。
如果查看事件内部的代码片段,您可能会看到有代码行来判断请求来自哪个应用服务连接,例如this.desktopBridgeConnection = desktopBridgeConnections[this.currentConnectionIndex]
。您将发送消息到正确AppServiceConnection
的,这应该是线程安全的。如果您在执行此操作时遇到实际的线程保存问题,您可以询问有关测试详细信息的问题。
推荐阅读
- android - ViewModel 实例很多,如何解决?
- javascript - Get Latitude and Longitude in Ruby On Rails
- python-3.x - 将位于父文件夹中的模块中的函数导入脚本
- windbg - 如何遍历字节字符串的搜索结果并偏移结果指针(在 WinDbg 中)?
- javascript - 无限滚动不适用于 Firefox,但适用于 Safari/Chrome
- java - Jmeter TCP采样器不循环
- css - css bug - 带有图片库的 div 仅适用于 iphone 6/7/8 - flex 和 grid
- sql - 包含 LEFT JOIN 的实体框架 Linq to SQL 表达式
- javascript - 使用 Javascript 级联下拉菜单
- ionic-framework - WebdriverIO 无法点击(离子)选项卡