Win10开发教程 如何从前台应用触发后台任务

本文我们主要讲的是有关后台任务的使用,估计大伙伴们不会陌生,后台任务一定要独立写到一个Runtime组件中吗,能不能写到主项目的代码中?

是可以的,在配置清单文件中,你只需要在Extension元素中指定Executable为主项目的.exe文件即可。

<Extension Category="windows.backgroundTasks" EntryPoint="……" Executable="xxxx.exe">
  <BackgroundTasks>
    ……
  </BackgroundTasks>
</Extension>

其实,Executable可以设置为$targetnametoken$.exe,这样在生成应用时,会自动用.exe文件的实际名称替换$targetnametoken$标签。

可是,非常严重地不推荐把后台任务写到主项目中,一则这不符合官方文档的常规性要求,不便于代码分类管理;二则,这种做法会带来严重的负面效果,如果后台任务激活时,前台应用没有运行倒无所谓,要是后台任务执行时前台应用正在运行,很可能会造成前台应用进程重启,给用户的感觉就是闪退。

 

好,上面只是给大家普及一下常识,建议大家在干活时最好按规矩办事,别老喜欢搞那些另类行为,另类不代表创新,只不过是幼稚罢了。

今天的主题是:我能不能在前台应用中,通过代码有目的地触发后任务呢?我们知道,常见的后台任务有后台音频、定时器、系统事件、网络传输控制等触发器,那有没有可以让我们手动去触发后台任务的触发器呢?

有,它的名字叫ApplicationTrigger,使用它,你在前台代码中就可以随时激活后台任务,而且还可以向后台任务传递参数。当需要执行后台任务时,直接调用ApplicationTrigger实例的RequestAsync方法即可,如果没有意外(比如泥石流、山体滑坡、地震等),那么后台任务就会执行。

原理已经跟大家交代了,下面还是用实例说话吧。

首先我定义了这么个后台任务,你猜猜它是干吗用的。

public sealed class BgTask : IBackgroundTask
{
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        var d = taskInstance.GetDeferral();
        // 取出与触发器相关的数据
        ApplicationTriggerDetails details = taskInstance.TriggerDetails as ApplicationTriggerDetails;
        if (details != null)
        {
            // 取出传递过来的参数
            ValueSet ps = details.Arguments;
            int na = Convert.ToInt32(ps["a"]);
            int nb = Convert.ToInt32(ps["b"]);
            // 开始进行运算
            int x = na;
            int res = 0;
            while (x <= nb)
            {
                res += x;
                x++;
                await Task.Delay(30); //延时
                // 报告进度
                ReportProgress(taskInstance, (uint)x, (uint)nb);
            }
            // 保存计算结果
            ApplicationData.Current.LocalSettings.Values["result"] = res;
        }
        d.Complete();
    }
    private void ReportProgress(IBackgroundTaskInstance instance, uint c, uint t)
    {
        ……
    }
}

人品高尚的你一定看出来了,这个任务主要是做加法运算的,指定一个起始值和一个最终值,从起始值开始相加,一直加到最终值,每加一次就把操作数+1。其中,每一轮运算后会拖延30毫秒,目的是方便看进度。本任务不太严谨,比如它没有检测如果终值小于始值时怎么处理,大家知道就行了,老周不想把代码搞复杂,仅供演示。

然后你必须记得在主项目中引用写有后台任务类的Rutime组件项目。

接下来,配置一下清单文件,打开Package.appxmanifest文件,找到Application节点,注意不是Applications节点,没有s的,随后加入扩展点。

<Application Id="App" …… >
  ……
  <Extensions>
    <Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.BgTask" >
      <BackgroundTasks>
        <Task Type="general"/>
      </BackgroundTasks>
    </Extension>
  </Extensions>
</Application>

<Task Type="general"/>表示该后任务是常规型,通用型,即大众化的后台任务,而不是精英级后台。

 
清单文件只是作声明,后台任务不会自动注册,需要用代码来完成注册。

const string TASK_NAME = "comptask";
private BackgroundTaskRegistration taskReg = null;
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    var res = await BackgroundExecutionManager.RequestAccessAsync();
    if (res == BackgroundAccessStatus.Unspecified || res == BackgroundAccessStatus.Unspecified)
    {
        ShowMessage("后台任务被禁用。"); return;
    }
    taskReg = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault(t => t.Name == TASK_NAME) as BackgroundTaskRegistration;
    // 注册后台任务
    if (taskReg == null)
    {
        BackgroundTaskBuilder bd = new BackgroundTaskBuilder();
        // 入口点
        bd.TaskEntryPoint = typeof(BackgroundTasks.BgTask).FullName;
        // 任务名称
        bd.Name = TASK_NAME;
        // 设置触发器
        ApplicationTrigger trigger = new ApplicationTrigger();
        bd.SetTrigger(trigger);
        taskReg = bd.Register();
        ShowMessage("后台任务注册成功。");
    }
    // 添加事件处理
    taskReg.Progress += TaskReg_Progress;
    taskReg.Completed += TaskReg_Completed;
}

注册前应该访问BackgroundTaskRegistration.AllTasks看看你需要的后台任务是不是已经注册了,重复注册没有意义。

下面代码通过ApplicationTrigger来触发后台任务。

    // 从注册的任务中取出触发器
    ApplicationTrigger trigger = taskReg.Trigger as ApplicationTrigger;
    // 准备参数
    ValueSet p = new ValueSet();
    p["a"] = n1;
    p["b"] = n2;
    // 触发后台任务
    var res = await trigger.RequestAsync(p);
    switch (res)
    {
        case ApplicationTriggerResult.Allowed:
            ShowMessage("后台任务已启动。");
            break;
        case ApplicationTriggerResult.CurrentlyRunning:
            ShowMessage("后台任务已经在运行了。");
            break;
        case ApplicationTriggerResult.DisabledByPolicy:
            ShowMessage("管理员不允许执行后台任务。");
            break;
        case ApplicationTriggerResult.UnknownError:
            ShowMessage("发生错误。");
            break;
}

 在调用RequestAsync方法时,可以向后台任务传递数据,数据用ValueSet类封装,其实就是个字典模型,key为字符串。

 方法调用后,会返回ApplicationTriggerResult枚举的值。如果值为Allowed表明后台任务已成功触发;如果为CurrentlyRunning表明后台任务还在运行中,“你所拨打的号码正在通话中,请稍后再试”;如果值为DisabledByPolicy表示后台任务被禁止了。

一切就绪,看看运行结果:

开发教程 如何从前台应用触发后台任务-sql 触发器 前台 提示">
 
呈现计算结果。

 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, 数据
, 应用
, 触发器
, 参数
代码
sql 触发器 前台 提示、web前台开发技术、网站前台开发培训班、web前台开发、web前台开发框架,以便于您获取更多的相关知识。

时间: 2024-10-25 14:31:35

Win10开发教程 如何从前台应用触发后台任务的相关文章

【Win10 应用开发】从前台应用触发后台任务

原文:[Win10 应用开发]从前台应用触发后台任务 有关后台任务的使用,估计大伙伴们不会陌生,而且老周曾经在某文中也简单讲述过.说到后台任务,老周想到了一个问题:有人问,后台任务一定要独立写到一个Runtime组件中吗,能不能写到主项目的代码中? 老周严重地回答你:是可以的,在配置清单文件中,你只需要在Extension元素中指定Executable为主项目的.exe文件即可. <Extension Category="windows.backgroundTasks" Entr

Android简明开发教程十三:Option Menu画笔示例

引路蜂二维图形画笔(Pen)示例含有四个示例,Lines ,Dashes ,LineJoin 和LineCap.打算采用Option Menu(主菜单) 的方式来选择不同示例. 首先要对GuidebeeGraphics2DView,和Graphics2DActivity做些改动,从这个示例开始,GuidebeeGraphics2DView需要动态 绘制不同图形(可以通过菜单,或是Thread).在GuidebeeGraphics2DView增加下面两个方法: final Runnable upd

Android简明开发教程四:Android应用基本概念

Android平台的一个显著的特点是"低耦合".Activity是Android应用的一个最基本的用户UI模块.如果采用Windows Form 应用作为参照,Activity相当于Windows中的WinForm.和Windows 应用不同的是,运行一个Activity或是Activity之间的交互是 通过消息来实现的.也就是说如果想在起动一个Activity或是在一个Activity中启动另一个Activity,是通过发送Intent消息来 触发,而不像Windows WinFor

安卓UI设计与开发教程 顶部标题栏(三)ActionBar实现层级导航的返回效果

今天我们继续来讲解ActionBar的使用,不清楚这个类的读者可以翻阅博主前几篇的文章或者在网络上查阅 相关的资料,关于这个类讲解的文章还是很多的,功能确实也很强大.好的,话不多说,让我们赶快进入正题 吧. 一.使用应用图标实现层级导航 在默认的情况下,应用程序图标显示在操作栏的左边.你 能够把这个图标当做操作项来使用,应用程序可以在这个图标上响应以下两个操作其中之一: <1> 返回应用程序的"主"Activity: <2> 向应用程序上级页面导航. 开发教程

《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现

原文:<ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现 摘要:我们要实现的是图层符号选择器,与ArcMap中的Symbol Selector的类似.本讲较前几讲而言,些许有些复杂,不过只要仔细琢磨,认真操作,你就很容易实现如下所示的符号选择器.   教程目录: 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与PageLayoutControl同步 第四讲 状态栏信息的添加与实现 第五讲 鹰眼的实现 第六讲 右键菜单添加

iOS10最新实现远程通知的开发教程详解_IOS

一.iOS推送通知简介 众所周知苹果的推送通知从iOS3开始出现, 每一年都会更新一些新的用法. 譬如iOS7出现的Silent remote notifications(远程静默推送), iOS8出现的Category(分类, 也可称之为快捷回复), iOS9出现的Text Input action(文本框快捷回复). 而在iOS10, 苹果可谓是大刀阔斧般的, 对远程通知和本地通知进行了大范围的更新. iOS10推出了全新的UserNotifications框架(iOS10之前从属于UIKi

Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证

原文:Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证     要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方审核,审核通过之后,会在后台顶部出现"高级功能"菜单.     使用"高级功能">"开发模式"之前,必须有一个已经部署在Internet

Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler

原文:Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler     上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK>我们讲述了如何使用Senparc.Weixin.MP SDK对接微信最基础的验证API,这一篇我们将具体讲一下这个SDK处理微信消息的核心:MessageHandler.     有关MessageHandler的实现原理和说明,在这篇Wiki中已经

Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明

原文:Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明     上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>介绍了如何通过通用接口获取AccessToken,有了AccessToken,我们就可以来操作自定义菜单,以及其他的高级接口,这一篇单讲自定义菜单.   一.自定义菜单规则 自定义菜单分为一级菜单和二级菜单. 一级菜单数量为1-3个,即打开公众账号直接可以看到排列在最下方的最多3个按钮.一级菜单的