从 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的主要内容,如果未能解决你的问题,请参考以下文章