我正在尝试播放由于Windows Notification Service WNS事件而被激活的BackgroundActivated Task(单个进程)的声音。

如果在前景中启动应用程序,然后将其最小化,则说明一切正常。

如果当前未启动该应用程序...则此方法不起作用。
我的应用程序的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

最佳答案

注意... WNS到达时,在以地面模式激活应用程序时,此选项始终起作用。

该问题似乎与以下事实有关:在正确设置MediaPlayer之前,与前景相同的后台激活任务常常被挂起。

在一些测试用例中,.. MediaPlayer似乎已正确安装……在这些情况下,MedialPlayer正常工作。但是与MediaPlayer无关的异步任务仍然会引发异常:。

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

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

关于c# - WNS从WNS调用的后台激活任务单进程模型中获取Windows Media Player,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39402236/

10-15 04:33