Windows 8 学习笔记(十八)--.后台任务BackgroundTask(I)

后台任务即是当应用程序处于挂起状态时,不会影响由于程序持起而带来的某些滞后而执行的一些后台操作,如下载文件、最新信息的推送等。当然,也应尽量减少一些没有必要的后台操作,保证电池的寿命。

后台任务处理一般用于以下几种情况:

1、消息推送
2、播放背景音乐
3、文件传输

4、共享文件  

后台任务中一般经常会使用以下一些类和方法:

1、BackgroundTaskBuilder 系统注册后台任务类
2、BackgroundTaskRegistration BackgroundTaskBuilder.Register()注册后台任务

3、SystemTrigger 一个后台任务必须有一个明确的Trigger才执行后台任务,通过SetTrigger()添加,一般Trigger的类型有以下一些类型 

Background task trigger type

Trigger event

When the background task is triggered

ControlChannelTrigger

ControlChannelTrigger

On incoming messages on the control channel.

MaintenanceTrigger

MaintenanceTrigger

It’s time for maintenance background tasks.

PushNotificationTrigger

PushNotificationTrigger

A raw notification arrives on the WNS channel.

SystemEventTrigger

InternetAvailable

The Internet becomes available.

SystemEventTrigger

LockScreenApplicationAdded

An app tile is added to the lock screen.

SystemEventTrigger

LockScreenApplicationRemoved

An app tile is removed from the lock screen.

SystemEventTrigger

ControlChannelReset

A network channel is reset.

SystemEventTrigger

NetworkStateChange

A network change such as a change in cost or connectivity occurs.

SystemEventTrigger

OnlineIdConnectedStateChange

Online ID associated with the account changes.

SystemEventTrigger

ServicingComplete

The system has finished updating an application.

SystemEventTrigger

SessionConnected

The session is connected.

SystemEventTrigger

SessionDisconnected

The session is disconnected.

SystemEventTrigger

SmsReceived

A new SMS message is received by an installed mobile broadband device.

SystemEventTrigger

TimeZoneChange

The time zone changes on the device (for example, when the system adjusts the clock for daylight saving time).

SystemEventTrigger

UserAway

The user becomes absent.

SystemEventTrigger

UserPresent

The user becomes present.

TimeTrigger

TimeTrigger

A time event occurs.

4、SystemCondition

     后台任务可以设置0个或多个条件,其用来描述当达到某种条件时执行后台任务才是有意义的。通过BackgroundTaskBuilder.AddCondition()添加.
5、BackgroundTaskProgressEventHandler
      BackgroundTaskBuilder可以注册ProgressEventHandler事件来报告UI后台执行的进度,如当下载文件事,可以报告UI当前文件下载的百分比。
6、BackgroundTaskCompletedEventArgs
     同样注册CompletedEventArgs事件可以在后台任务执行完后,通知UI。
7、Unregister
    通过Unregister()可以取消后台任务的注册

说了这么多,先来创建一个简单的后台任务,功能非常简单,就是后台任务定时刷新UI

 第一步:先创建一个空白的Metro项目,项目名为BackgroundProject

前台页面放了两个按钮(注册Task、注销Task)、一个TextBlock控件(显示后台任务的状态)

 第二步:创建一个Class Library,该类库用于实现后台的具体任务,项目名为BackgroundSecniao,需要特别注意的时,这里需要将该项目的输出更改为Winmd文件,不要默认生成DLL

 

第三步:BackgroundSecniao中新建一个类TimerBackTask.cs类,该类必须继承IBackgroundTask接口

 public sealed class TimerBackTask : IBackgroundTask    

 {
        volatile bool _cancelRequested = false;
        BackgroundTaskDeferral _deferral = null;
        ThreadPoolTimer _periodicTimer = null;
        uint _progress = 0;
        IBackgroundTaskInstance _taskInstance;

        public void Run(IBackgroundTaskInstance taskInstance)
        {
            taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);
            _deferral = taskInstance.GetDeferral();
            _taskInstance = taskInstance;

            _periodicTimer = ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler(PeriodicTimerCallback), TimeSpan.FromMilliseconds(1000));
        }

        private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
        {
            _cancelRequested = true;           
        }

        
        private void PeriodicTimerCallback(ThreadPoolTimer timer)
        {
            if ((_cancelRequested == false) && (_progress < 100))
            {
                _progress += 10;
                _taskInstance.Progress = _progress;
            }
            else
            {
                _periodicTimer.Cancel();

                var settings = ApplicationData.Current.LocalSettings;
                var key = _taskInstance.Task.TaskId.ToString();
                if (_cancelRequested)
                {
                    settings.Values[key] = "Canceled";
                }
                else
                {
                    settings.Values[key] = "Completed";
                }
                _deferral.Complete();
            }
}

 第四步:BackgroundProject中的Package.appxmanifest需要设置下,需要在声明中添加相应的后台任务

 

 第五步:Register按钮中先注册Task

var builder = new BackgroundTaskBuilder();
builder.Name = SampleBackgroundTaskName;
builder.TaskEntryPoint = SampleBackgroundTaskEntryPoint;
SystemTrigger trigger = new SystemTrigger(SystemTriggerType.TimeZoneChange, false);
builder.SetTrigger(trigger);
SystemCondition condition = new SystemCondition(SystemConditionType.UserPresent);

if (condition != null)
{
    builder.AddCondition(condition);
}                
 BackgroundTaskRegistration task = builder.Register();
 task.Completed += task_Completed;
 task.Progress += task_Progress;    

 实现BackgroundTaskProgressEventHandlerBackgroundTaskCompletedEventArgs事件 

     void task_Progress(BackgroundTaskRegistration sender, BackgroundTaskProgressEventArgs args)

        {
            Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                () =>
                    {
                         var taskRegistration = sender as IBackgroundTaskRegistration;
                         var progressArgs = args as BackgroundTaskProgressEventArgs;

                          if ((taskRegistration != null) && (progressArgs != null))
                           {                                                 
                                 tbProgress.Text = "Progress: " + progressArgs.Progress + "%";
                           }
                      });
        }

        void task_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
        {
            Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                   () =>
                    {
                       try
                       {
                          var taskCompletion = sender as IBackgroundTaskRegistration;
                          var completionArgs = args as BackgroundTaskCompletedEventArgs;

                           if ((taskCompletion != null) && (completionArgs != null))
                           {
                               var key = taskCompletion.TaskId.ToString();
                               var settings = ApplicationData.Current.LocalSettings;                                                    
                               tbProgress.Text = settings.Values[key].ToString();                                                   
                           }
                        }
                       catch (Exception ex)
                       {
                        }
              });
        }


Ungister按钮事件:
 foreach (var cur in BackgroundTaskRegistration.AllTasks)           

  {
        if (cur.Value.Name == SampleBackgroundTaskName)
        {
            cur.Value.Unregister(true);
        } 
 }              

 在本地运行调试时,需要将TimerBackTask挂起,才能看到效果,挂起设断点也可以Debug后台程序

 

 后台任务还有好多东西要学习,如锁屏时后台任务的执行、推送、后台任务与程序的生命周期等,内容相当之多,上面的是最基本最简单的内容了!  

 

posted on 2012-08-31 21:48  ShinyTang  阅读(4040)  评论(1编辑  收藏  举报

导航

作者:LucyTangLucyTang's Blog on 博客园
出处:http://www.cnblogs.com/jing870812/

本作品由LucyTang创作,采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。 任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言