从 WNS 调用的 BackgroundActivated 任务单进程模型的 WIndows Universal MediaPlayer

Posted

技术标签:

【中文标题】从 WNS 调用的 BackgroundActivated 任务单进程模型的 WIndows Universal MediaPlayer【英文标题】:WIndows Universal MediaPlayer From BackgroundActivated Task Single Processs Model Invoked from WNS 【发布时间】:2016-09-09 00:51:58 【问题描述】:

我正在尝试从因 Windows 通知服务 WNS 事件而激活的 BackgroundActivated 任务(单进程)播放声音。

如果应用程序在前台启动然后最小化......一切正常。

如果应用程序当前未启动...这不起作用。 我的应用的 OnBacgroundActivated:

 protected override async void OnBackgroundActivated(BackgroundActivatedEventArgs args) 
  PersistLog.v(TAG, "OnBackgroundActivated");
  await VANotification.Process(args.TaskInstance);
  //base.OnBackgroundActivated(args);
  PersistLog.v(TAG, "OnBackgroundActivated:Completed");

VANotification.Proces

public async Task Process(IBackgroundTaskInstance taskInstance) 
  PersistLog.v(TAG, "Process");
  var Deferral = taskInstance.GetDeferral();
  RawNotification notification = (RawNotification)taskInstance.TriggerDetails;
  var msg = notification.Content;
  PersistLog.i(TAG, "Msg:" + msg);
  var a = Record(msg);
  await TTSSandSound.Say(a);
  Deferral.Complete();
  PersistLog.v(TAG, "Process:Complete!");

TTSAndSound.Say ...

public static async Task Say(String text) 
  PersistLog.v(TAG, "Say:" + text);
  sSynthesize.Voice = SpeechSynthesizer.DefaultVoice;
  var ss = sSynthesize.SynthesizeTextToStreamAsync(text);
  var t = new TaskCompletionSource<MediaSource>();
  ss.Completed = (stream, status) => 
    var sr = stream.GetResults();
    MediaSource ms = MediaSource.CreateFromStream(sr,sr.ContentType);
    t.TrySetResult(ms);
  ;
  var _ms = await t.Task;
  var r = await WaitFor(_ms);
  PersistLog.v(TAG, "Say:Complete:" + r);


private static async Task<bool> WaitFor(MediaSource ms) 
  var mp = new MediaPlayer();
  mp.Source = ms;
  var t = new TaskCompletionSource<bool>();
  mp.MediaEnded += (p, o) => 
      t.TrySetResult(true);
  ;
  mp.MediaFailed += (p, o) => 
    t.TrySetResult(true);
  ;
  mp.Play();
  return await t.Task;

我实际上不确定这是 MediaPlayer 的问题,还是 BackgroundActivated 任务似乎没有延迟延迟的事实。我可以从日志中看到 MediaPlayer 正确完成。但是我在尝试执行 MediaPlayer Play 的同时收到了一个 App Suspending 事件......然后在调用之后没有任何异步代码:

 await TTSSandSound.Say(a);

似乎在运行。我已关注: Background media playback sample

【问题讨论】:

【参考方案1】:

注意...当 WNS 到达时应用程序在前台模式下激活时,这始终有效。

问题似乎与在正确设置 MediaPlayer 之前,与前台处于同一进程中的后台激活任务经常被挂起的事实有关。

在一些测试用例中...... MediaPlayer 似乎设置正确......在这些情况下,MedialPlayer 工作正常。但是与 MediaPlayer 无关的异步任务仍然会抛出异常:.

at Hap.App.<OnBackgroundActivated>d_27.MoveNext()

这似乎与应用被暂停的时间有关。似乎由 WNS 触发的本地后台激活任务在被暂停之前只允许不到 1 秒。

【讨论】:

以上是关于从 WNS 调用的 BackgroundActivated 任务单进程模型的 WIndows Universal MediaPlayer的主要内容,如果未能解决你的问题,请参考以下文章

Azure 通知中心“WNS 通道已断开”错误

设置 Windows 推送通知服务 (WNS) 服务器端

无法发送 WNS 推送通知

推送通知的 WNS 或 MPNS?

GCM 和 WNS 禁止向非活动设备发送推送通知的策略

小技巧FPGA工程综合后出现WNS或者TNS小于零的问题处理