触发事件时在后台执行代码



我目前正在完成活动本身的所有工作,但这似乎不是首选的方式,因为几分钟的不活动后代码不会在电话上执行。活动声明如下:

public PlaybackModel()
{
    ...
    queue.CurrentItemChanged += async (o, ea) =>
    {
        var res = ScrobbleHelper.TrySend(ea.OldItem);
        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
        {
            var bg = App.Ref.IsBackground;
            currentItem = o.CurrentItem;
        });
    };
    ...
}

此事件似乎有5个可能的结果:

  1. 当应用在前景时,杂货均正常工作;
  2. 当应用在屏幕上打开屏幕时,该应用程序在后台工作时可以正常工作(用户正在做其他事情(;
  3. 最近关闭屏幕时(当请求关闭屏幕后不久发送请求时(,crobble正在正常工作(
  4. 无法发送杂货,因此当屏幕关闭一分钟多一分钟时,它会被缓存(似乎互联网连接已被切断,因此杂货在本地被缓存(;
  5. 如果长时间关闭屏幕,则根本没有执行代码。

考虑到这一点,我正在考虑使用ApplicationTrigger使用过程中的背景任务来调用Scrobbler,但我不确定该如何处理。

一方面,这是唯一可以执行代码而没有应用程序在前景中运行的代码的东西,但是二手,如果事件处理程序未调用代码本身,我不确定如果任务会触发。

是否还有其他UWP的API或功能可以有用?如果不是,我该如何实现背景任务以实现最大效率?

谢谢!

在Windows设备上,在前景应用程序中运行背景事件有一些限制,即,当屏幕在一定时间内关闭时,它们会被冷冻。它是为了减少电池的消耗,整个过程被悬挂在内存中,并且没有发射事件。

DO是一种在专用过程上运行背景任务的方法,即使设备在一段时间内未使用,该任务也可以正常运行。您需要创建一个专门的类实现IBackgroundTask,然后将其固定以适当的触发器并进行注册。(如果该应用必须将内容写入应用程序状态,则您还需要一些IPC接口要考虑,因为背景任务作为另一个过程运行。(

听起来像您的应用程序正在播放媒体,并且您希望在应用程序进入后台或屏幕锁定时防止其悬挂。最好的方法是使用去年随着周年纪念更新(1607(发布的新的过程中的背景媒体播放功能。这是文档:

https://learn.microsoft.com/en-us/windows/uwp/audio-video-camera/background-audio

一个需要注意的是,在不使用时,操作系统可能会使网络适配器入睡。从症状中,您描述的可能是您在这里遇到的事情。尝试将此代码添加到您的应用程序中,以确保即使屏幕锁定屏幕,网络连接仍保持活动状态:

Windows.Media.Playback.MediaPlayer mp;
public void CreatePlayer()
{
  Windows.Media.Core.MediaBinder mb = new Windows.Media.Core.MediaBinder();
  mb.Binding += Mb_Binding;           
  var ms = Windows.Media.Core.MediaSource.CreateFromMediaBinder(mb);
  mp = new Windows.Media.Playback.MediaPlayer();
  mp.CommandManager.IsEnabled = false;
  mp.Source = ms;
}
private void Mb_Binding(Windows.Media.Core.MediaBinder sender, Windows.Media.Core.MediaBindingEventArgs args)
{
  var d = args.GetDeferral();
}

谢谢Stefan Wick -Windows开发人员平台

相关内容

  • 没有找到相关文章

最新更新