我有一个适用于 Windows 10 的 UWP 应用程序,用于通过 WNS 接收 Raw 和 Toast 通知。我可以在前台和后台挂起时正确接收消息。
在前台,我设置了一个处理程序 PushNotificaitonChannel.PushNotificationReceived 并在处理程序中设置 args.Cancel == true 一旦我处理了消息。
对于后台处理,我使用 PushNotificationTrigger() 注册了一个进程内后台任务。除了一个令人困惑的问题之外,这非常有效:我经常收到原始通知的重复副本。重复的数量可以在 1-20+ 之间。
从版本 14393 到最新发布的版本 17763,我在许多不同代的 Windows 上都看到了这种行为。
我可以在 Visual Studio 下重现副本,并注意到调用堆栈在第一张收据和重复收据之间有所不同。我没有发现任何隐藏在本机/COM 数据结构中的状态来指示如何停止重复。如果有帮助,我可以发布堆栈跟踪。
我希望其他人知道如何阻止这种情况——以某种方式确认在进程内后台任务中收到了原始 WNS 消息。
非常感谢您阅读和思考这个问题。
编辑:在处理最小示例时,我发现了以下行为模式。
- 在前台测试应用程序,发送原始推送;正常收到
- 通过正常关闭按钮关闭应用程序;应用程序未运行
- 发送新的原始推送;应用程序在后台启动并接收原始推送;应用程序进入暂停状态
- (应用程序仍然暂停)发送新的原始推送;应用程序开始运行;相同的原始推送收到两次;应用程序回到暂停状态
- 这可以发生任何次数,并且原始推送只收到两次
- 杀死应用程序(使用任务管理器中的结束任务);应用程序未运行
- 发送新的原始推送;应用程序开始运行;两次收到相同的原始推送(如#4);应用程序回到暂停状态
- 最奇怪的是:发送新的原始推送,应用收到原始推送三次;应用程序回到暂停状态
- 现在,每个原始推送都会收到三次;如果我再次杀死该应用程序并发送原始推送,则重复次数会增加一。