Windows runtime Windows phone 8.1后台任务和前台应用程序通信

Windows runtime Windows phone 8.1后台任务和前台应用程序通信,windows-runtime,windows-phone,windows-8.1,windows-phone-8.1,Windows Runtime,Windows Phone,Windows 8.1,Windows Phone 8.1,我正在开发一个Windows Phone 8.1应用程序,它为每小时操作注册一个后台任务计时器触发器。因此,基本上,后台任务每60分钟唤醒一次并执行一些操作 我的问题是,当后台任务正在进行时,如果用户唤醒应用程序,是否有一种方法可以向用户显示后台任务过程中发生了什么 我知道这是两个不同的过程。我使用Silverlight 8.1项目作为前台应用程序,使用托管windows运行时项目作为后台任务。我正在使用silverlight应用程序注册后台任务,但我现在不知道如何在这两个进程之间创建通信桥梁

我正在开发一个Windows Phone 8.1应用程序,它为每小时操作注册一个后台任务计时器触发器。因此,基本上,后台任务每60分钟唤醒一次并执行一些操作

我的问题是,当后台任务正在进行时,如果用户唤醒应用程序,是否有一种方法可以向用户显示后台任务过程中发生了什么

我知道这是两个不同的过程。我使用Silverlight 8.1项目作为前台应用程序,使用托管windows运行时项目作为后台任务。我正在使用silverlight应用程序注册后台任务,但我现在不知道如何在这两个进程之间创建通信桥梁

有什么线索吗?这可能吗

以下是关于应用程序与其后台任务之间通信的一些想法(或信息)

  • 您可以使用对象的进度和已完成事件。您可以使用BackgroundTaskRegistration.AllTasks获取该对象-此属性返回应用程序注册的后台任务列表。每次应用程序运行时,您都必须订阅这些活动

    在后台任务中,您可以将IBackgroundTaskInstance对象的Progress属性设置为某个UInt32值,应用程序将接收事件。也许你可以把你需要的编码在那个数字里。例如:1表示任务正在初始化,2-任务正在进行工作,依此类推

  • 这两个进程都可以访问相同的文件,因此您可以将其用于某些用途

  • 用于在两个进程之间同步代码的执行

这就是我现在能想到的。我希望有帮助


另外,我还没有真正尝试过这些活动,但它们似乎很有用。

我已经在通信b/w后台任务和应用程序it本身上做了一些POC。我使用的是windows通用应用程序,但它也可以在silverlight手机应用程序中使用

private IBackgroundTaskRegistration timeZoonChangeTask;
    public MainPage() 
    {
        this.InitializeComponent();

        NavigationHelper nvHelper = new NavigationHelper(this);
        IReadOnlyDictionary<Guid, IBackgroundTaskRegistration> allTasks = BackgroundTaskRegistration.AllTasks;
        if (allTasks.Count() == 0)
        {
            lblMessage.Text = "No Task is registered at the moment";
        }
        else//Task already registered
        {
            lblMessage.Text = "Timezoon Task is registered";
            this.GetTask();
        }
    }

    /// <summary>
    /// Time zoon task registration.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        await BackgroundExecutionManager.RequestAccessAsync();

        BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
        taskBuilder.Name = "MyBackgroundTask";

        SystemTrigger systemTrigger = new SystemTrigger(SystemTriggerType.TimeZoneChange, false);
        taskBuilder.SetTrigger(systemTrigger);

        taskBuilder.TaskEntryPoint = typeof(MyBackgroundTask.TheTask).FullName;
        taskBuilder.Register();
        lblMessage.Text = "Timezoon Task is registered";


        this.GetTask();

    }

/// Get registered task and handel completed and progress changed events.
    /// </summary>
    private void GetTask()
    {
        var timeZoonChangeTask = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault();
        timeZoonChangeTask.Completed += timeZoonChangeTask_Completed;
        timeZoonChangeTask.Progress += timeZoonChangeTask_Progress;

    }

    /// <summary>
    /// raised when task progress is changed app is active
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="args"></param>
    void timeZoonChangeTask_Progress(BackgroundTaskRegistration sender, BackgroundTaskProgressEventArgs args)
    {
        this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            lblTaskProgress.Text = args.Progress.ToString() + "%";
            recProgress.Width = 400 * (double.Parse(args.Progress.ToString()) / 100);
        });
        //this.Dispatcher.BeginInvoke(() =>
        //    {

        //    });
    }

    /// <summary>
    /// Raised when task is completed and app is forground
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="args"></param>
    void timeZoonChangeTask_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
    {
        this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
          {
              lblMessage.Text = "Task Excecution is completed";
          });
    }
私有IBackgroundTaskRegistration timeZoonChangeTask;
公共主页()
{
this.InitializeComponent();
NavigationHelper nvHelper=新的NavigationHelper(此);
IReadOnlyDictionary allTasks=BackgroundTaskRegistration.allTasks;
if(allTasks.Count()==0)
{
lblMessage.Text=“目前未注册任何任务”;
}
else//任务已注册
{
lblMessage.Text=“Timezoon任务已注册”;
这个。GetTask();
}
}
/// 
///时间缩放任务注册。
/// 
/// 
/// 
专用异步无效按钮\u单击(对象发送方,路由目标)
{
等待BackgroundExecutionManager.RequestAccessAsync();
BackgroundTaskBuilder taskBuilder=新建BackgroundTaskBuilder();
taskBuilder.Name=“MyBackgroundTask”;
SystemTrigger SystemTrigger=新系统触发器(SystemTriggerType.TimeZoneChange,false);
taskBuilder.SetTrigger(系统触发器);
taskBuilder.TaskEntryPoint=typeof(MyBackgroundTask.TheTask).FullName;
taskBuilder.Register();
lblMessage.Text=“Timezoon任务已注册”;
这个。GetTask();
}
///完成注册任务和handel,并更改事件进度。
/// 
私有void GetTask()
{
var timeZoonChangeTask=BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault();
timeZoonChangeTask.Completed+=timeZoonChangeTask_Completed;
timeZoonChangeTask.Progress+=timeZoonChangeTask\u进度;
}
/// 
///任务进度更改时引发,应用程序处于活动状态
/// 
/// 
/// 
void timeZoonChangeTask_进度(BackgroundTaskRegistration发件人,BackgroundTaskProgressEventArgs args args)
{
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,()=>
{
lblTaskProgress.Text=args.Progress.ToString()+“%”;
recProgress.Width=400*(double.Parse(args.Progress.ToString())/100);
});
//this.Dispatcher.BeginInvoke(()=>
//    {
//    });
}
/// 
///任务完成且放弃应用程序时引发
/// 
/// 
/// 
void timeZoonChangeTask_已完成(BackgroundTaskRegistration发件人,BackgroundTaskCompletedEventArgs args args)
{
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,()=>
{
lblMessage.Text=“任务执行完成”;
});
}
下面是任务类

public sealed class TheTask:IBackgroundTask
{
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        ///Get Deferral if we are doing aysnc work. otherwise it will not work. 
        //Always get deferral it will not harm.
        var deferral = taskInstance.GetDeferral();


        taskInstance.Canceled += taskInstance_Canceled;

        for (uint i = 0; i < 10; i++)
        {
            taskInstance.Progress = i + 10;
            await Task.Delay(2000);
        }

        //Write last run time somewhere so the gorground app know that at when last time this backgournd app ran.

        ///Set this progress to show the progesss on the forground app if it is running and you want to show it.
        taskInstance.Progress = 0;

        deferral.Complete();
    }

    void taskInstance_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
    {

    }
}
公共密封类任务:IBackgroundTask
{
公共异步无效运行(IBackgroundTaskInstance taskInstance)
{
///如果我们正在进行aysnc工作,请获得延期。否则它将不起作用。
//总是得到延期,这不会有什么坏处。
var deleral=taskInstance.getDeleral();
taskInstance.cancelled+=taskInstance\u cancelled;
对于(uint i=0;i<10;i++)
{
taskInstance.Progress=i+10;
等待任务。延迟(2000);
}
//将上次运行时间写入某个位置,以便gorground应用程序知道上次运行此Backgound应用程序的时间。
///如果forground应用程序正在运行且您希望显示,请设置此进度以显示forground应用程序上的进度。
taskInstance.Progress=0;
延迟。完成();
}
void taskInstance_已取消(IBackgroundTaskInstance发件人,BackgroundTaskCancellationReason)
{
}
}

谢谢亚森。这是一种很好的思考方式。我去看看。我也在考虑使用Windows.Storage local设置来存储一个布尔值,并在计划同步进行时将其设置为true,在完成时将其设置为false。因此,当前台应用程序打开时,用户收到一个通知,说后台正在发生一些事情。@golldy,如果你愿意的话