後台任務

後台任務

後台任務是指系統提供的可以在後台運行的進程,即使應用程式已經被掛起 或者不再運行了,但是屬於該應用程式的後台任務還可以繼續默默地執行相關的操作。它們通常在不打擾用戶其它工作的時候默默的執行。這樣的任務叫後台任務。與之對比,前台任務就是用戶看得見的。

後台任務提供了一種方案讓應用程式關閉之後依然可以繼續運行相關的服務,但是這是有限制的,它不可能實現在前台運行的應用程式的所有功能,只適合進行輕量的任務的執行,比如獲取網路新訊息的通知、定期提醒等操作。所以,後台任務真正的意義是作為應用程式的一個後台的 輕量服務進行運行,紿用戶提供一些重要的信息通知或者為應用程式記錄—些重要的信息。

用戶正在處理的任務通常會被分配較高的系統資源和優先權,如果後台任務過多,則容易出現系統不穩定的現象。

基本介紹

  • 中文名:後台任務
  • 外文名:Background task
  • 套用:計算機科學
原理,工作方式,進度和完成,後台任務舉例,

原理

後台任務跟應用程式的關係,可以理解為後台任務是應用程式裡面一個非常獨立的組件,它並不是運行在應用程式的執行緒上的,它運行的執行緒是完全獨立的,後台任務與前台任務的區別是:前台任務會占據整個螢幕,用戶直接與其進行互動:而後台任務不能與用戶互動是後台務依然可以對磁貼(Tile),吐司通知(Toast)和鎖屏(Lock Screen)進行更新和操作。因為前台要與用戶互動,它使用所有可用的系統資源,包括CPU處理時間和網路資源等,並且不受限,而後台任務使用系統資源的時候是受限制的。
我們知道,Windows 應用程式的生命周期分為Running、Suspcnded、Terminated三種狀態。應用程式處於前台時,為Runnmg狀態;處於後台時,為Suspended狀態,用戶關閉應用程式時或者在Suspended狀態太久,系統自動關閉應用程式時,為Terminated狀態。那么,後台任務應該在應用程式的3種狀態下運行,也就是說它對於應用程式的狀態是完全獨立,但是如果應用程式在Running狀態下,應用程式是可以對後台任務進行操作的,比如關閉、匯報進度等,應用程式在前台運行的時候可以對後台任務進行控制。
後台的原理示意圖如圖18.1所示,虛線兩邊分別表示Application和System。Application就是我們的應用程式,System就是負責處理後台任務的Service。首先,在應用程式裡面,我們要註冊Trigger,也就是任務的觸發器,相當於是在某個時機適當地觸發後台任務的運行。其次,在應用程式中註冊後台任務,在後台任務裡面會實現相關的操作以及包含了什麼樣的Trigger可以觸發這個後台任務,註冊之後,在System Infrastructure(系統的基礎服務)中就保留了這個註冊信息。不論是關閉了應用程式還是重新啟動了設備,這個註冊信息都會存在,但是要注意如果應用程式被用戶卸載了,那么該應用程式所對應的後台任務也不復存在了。再次,當合適的Trigger事件來臨,System Infrastructure會搜尋與這個Trigger相匹配的後台任務,然後啟動該後台任務。

工作方式

後台任務可以在應用程式處於掛起狀態時運行。但是,如果應用程式己掛起,則它無法運行任何代碼。那么,後台任務如何才能知道何時運行?當然,己掛起的應用程式不能啟動後台任務。後台任務由作業系統運行。它們關聯到一個用於通知任務運行的觸發器, 此外,它們還可以關聯到一組可選的條件。
例如,有一個名為UscrPresent的觸發器。該觸發器表示以下事件:用戶登錄到計算機, 或者休息(在短時間內計算機上沒有用戶活動)後返冋計算機。與該觸發器結合使用, InternetAvailable條件表示後台任務將在用戶在場並且Internet可用的情況下立即啟動。如果用戶返回計算機,但Internet不可用,那么後台任務不會啟動。
當然,作業系統必須知道應用程式具有一個或多個後台任務,而且它還必須知道特定任務所綁定到的觸發器和條件。由應用程式負責與作業系統協商有關其自己的後台任務的各種情景方案。如圖14-7所示,整個過程分為以下幾個步驟。
(1)包含後台任務的應用程式註冊有關應該用於啟動後台任務的觸發器的詳細信息. 在上述特定情況中,應用程式註冊UserPresent觸發器,這是一個系統事件觸發器。
(2)該應用程式在系統基礎結構中註冊用於實現後台任務的類。在該階段中,應用程式會傳遞在上一步中指定的有關觸發器的詳細信息。
後台任務
(3)當事件觸發時(在該示例中,為UscrPresent事件),系統會通知後台任務基礎架構。
(4)基礎結構知道在發生特定事件時應該啟動的所有後台類(由於有了之前的註冊過程),並通過實例化指定的後台任務類啟動相應的任務。

進度和完成

每個後台任務都可以向其應用程式通報其任務進度和完成情況。當然.這些信息僅在應用程式正在運行時是有用的.而在套用被掛起和終止時是沒有意義的,因此.通知機制是不可靠的,並且應用程式也不應該請求獲取這些通知。下面將簡要地介紹如何啟用這些通知。在應用程式和其後台任務之間進行可靠數據傳輸的最佳方式是使用程式包數據設定或檔案。如果應用程式和其後台任務都在運行,其中一方可以通過調用 ApplicationData的SignalDataChanged方法將其改變情況通知給另一方。
首先,應用程式必須獲取後台任務的BackgroundTaskRegistration對象的引用。通過則用 BackgroundTaskBuilder的Register方法,或者調用 BackgroundTaskRegistration 類的靜態AllTasks屬性,就可以獲取該引用。
一旦我們獲取了BackgroundTaskRegistration對象,該對象公開的Progress事件和Completed事件就可以用於登記回調方法。注意,這些回調方法不是使用GUI執行緒調用的,因此,如果需要操縱用戶互動界面的組件。我們必須調用CoreDispatcher的RunAsync方法。
在任務每次運行時,其Run方法都會被傳入一個實現了IBackgroundTasklnstance接口的新對象:
後台任務
該互動界面定義了一個UInt32 Progress屬性。當後台任務對該屬性進行設定時, Windows會在應用程式中引發Progress事件(如果該套用正在運行),並將進度狀態值傳遞給應用程式。應用程式的回調方法會接收到一個BackgroundTaskProgressEventArgs對象.該對象的唯讀Progress 屬性會返回系統代碼設定的任意值。
當任務的Run方法返回時,Windows會在應用程式中引發Completed事件(如果該套用正在運行應用程式的回調方法會接收到一個BackgroundTaskCompletedEventArgs對象.該對象程式包含一個 CheckResult方法。如果任務的Run方法拋出了一個未處理的異常,CheckResult方法將再次引發該異常,以便我們能夠知道任務是否成功地完成。注意,該機制是十分不可靠的。僅當 任務的Run方法同步執行各項工作時,CheckResult方法才能正常運行。也就是說,Run方法不能是異步方法,也不能含有延時。然而,需要說明的是,同步執行Run方法是很好的途徑,因為GUI執行緒不會執行這樣的任務。事實上,同步執行各項工作甚至有可能是迫切需要的,因為這種方式可以減少記憶體開支並且改善性能,由於配額有限,這一點會是重要的考慮因素。
Completed事件和Progress事件的處理程式都將原始的註冊任務作為一個BackgroundTaskRegistration 參數進行接收。這允許Completed事件和Progress事件對多個已註冊的任務逬行區別,而這些任務都使用相同的Completed事件和Progress事件處理器方法。例如,應用程式可以註冊維護觸發器,也可以註冊系統觸發器。這兩種觸發器都可以使用相同的Completed事件處理程式。然而,兩者的BackgroundTaskRegistration 對象的名稱和任務ID是不同的。同樣地,BackgroundTaskProgressEventArgs對象和BackgroundTaskCompletedEventArgs對象都具有InstanceId屬性,應用程式可以藉此對不同的任務實例進行區分,例如,當我們在短時間內接收到多個網路條件改變的信號時,就可能發生這種情況。

後台任務舉例

比如,一個文本編輯軟體,幫助用戶編輯文字的任務都是前台執行的。如果這個軟體做得好,最好還有自動保存檔案的功能,這樣在系統突然崩潰之後,不至於所有用戶做的改動都白費。自動保存這個功能一般都被作為後台任務,他在執行時,不打擾用戶其它工作。

相關詞條

熱門詞條

聯絡我們