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后台程序

 

 后台任務還有好多東西要學習,如鎖屏時后台任務的執行、推送、后台任務與程序的生命周期等,內容相當之多,上面的是最基本最簡單的內容了!  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM