אפליקציות מטרו ו- Background Tasks

17 ביולי 2012

תגיות: ,
תגובה אחת
win8_logoבפוסט הקודם תארתי את ה-process lifecycle של אפליקציות מטרו וקיבלתי תגובות מודאגות לגבי משימות טיפוסיות של אפליקציות שלא נרצה שיופסקו ברגע שהאפליקציה עוברת לרקע והופכת להיות suspended. הדוגמאות הן רבות: הורדת קבצים, השמעת מוזיקה וקבלת/משיכת עידכונים מהשרת וכו'.

כצפוי,  windows 8 אכן מאפשרת לנו לבצע משימות אלו גם אם האפליקציה נמצאת ברקע, כלומר במצב suspended. ה- API המאפשר ביצוע משימות אלו הוא ה-background task.
ה- Background tasks מאפשרים לאפליקציה להמשיך להיות פעילה גם כאשר ה- foreground אינו פעיל.

בפועל, הלוגיקה של האפליקציה שמתבצעת ב- background task רצה ב-executable נפרד מה-executable של אפליקציה המטרו. Windows 8 מספקת לאפליקציה host שאינו כפוף לחוקי ה-life cycle של אפליקציות מטרו: הוא ממשיך להתבצע גם כאשר אפליקציית המטרו הופכת להיות suspended ואפילו כאשר היא מועברת למצב terminated ע"י מערכת ההפעלה.

image

עבור תסריטים נפוצים Windows 8 מספק מספר רכיבים מוכנים המאפשרים לבצע משימות ברקע:

  • Windows push notifications: ל- windows 8 תמיכה מלאה בקבלת notification משירות ה-windows push notification service הנמצא ב-Azure. שירות זה מאפשר לרכיבי שרת של האפליקציה "לדחוף" לצד הקליינט של האפליקציה notification עם מידע רלוונטי. windows 8 מקבל עבור האפליקציה את המידע הנדחף אליה גם כאשר האפליקציה נמצאת ברקע או לא רצה בכלל (אני ארחיב על נושא זה בפוסט הבא).
  • Background transfer API: ה- API הזה (Windows.Networking.BackgroundTransfer namespace) תוכנן לתמוך בפעולות מתמשכות של העלאת/הורדת חומרים דוגמת וידאו, מוזיקה ושאר סוגי מידע. כאשר אפליקציה מבצעת פעולות של upload/download הפעולה מתבצעת על ידי executable שונה מה-executable של האפליקציה (BackgroundTransferHost.exe) וכאשר האפליקציה עוברת לרקע תהליך הורדת הנתונים ממשיך כרגיל.

כאשר רכיבים אלו אינם נותנים מענה מתאים לצרכים של האפליקציה, ניתן להגדיר background task בצורה מפורשת באפליקציה, שיבצע את הלוגיקה הנדרשת. ה-background task יופעל ע"י windows 8 כתגובה לאירוע שהתרחש במערכת (ולא באפליקציה) בהינתן שהתקיימו אפס או יותר תנאים שהוגדרו לצורך ביצוע הלוגיקה. דוגמא לאירוע שיכול לגרור ביצוע של background task יכולה להיות שינוי ב-session של המשתמש (user away) או time based trigger. תנאי לדוגמא לביצוע ה-task יכול להיות זמינות הרשת.

 

כיצד מוסיפים לאפליקציה background tasks:

את ה- background task יש לממש בפרויקט נפרד מהפרויקט של אפליקציית ה-foreground. פרויקט זה צריך להיות מוגדר כ- WinMD. בדרך זו windows 8 יכולה להריץ את ה-task שלנו ב-executable שונה מה- exe של אפליקצית המטרו.

clip_image005

בפרויקט החדש יש להגדיר מחלקה המממשת את IBackgroundTask interface ומכילה את הלוגיקה הנדרשת לביצוע המשימה.

   1: public sealed class MyBackgroundTask:IBackgroundTask

   2: {

   3:     public void Run(IBackgroundTaskInstance taskInstance)

   4:     {

   5:         Debug.WriteLine("Background " + taskInstance.Task.Name + " Staring...");

   6:         RunBackgroundTaskLogic();

   7:     }

   8:  

   9:     private void RunBackgroundTaskLogic()

  10:     {

  11:         throw new NotImplementedException();

  12:     }

  13: }

באפליקצית ה- foreground יש לרשום את background task באמצעות ה-BackgroundTaskBuilder ולהגדיר את האירוע והתנאים שבהם windows 8 יפעיל את ה- task.

   1: void RegisterBackgroundTask()

   2:    {

   3:        var taskBuilder = new BackgroundTaskBuilder();

   4:        var systemTrigger = new SystemTrigger(SystemTriggerType.NetworkStateChange, false);

   5:        taskBuilder.SetTrigger(systemTrigger);

   6:        taskBuilder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));

   7:        taskBuilder.Name = BackgroundTaskName;

   8:        taskBuilder.TaskEntryPoint = BackgroundTaskEntryPoint;

   9:        var task = taskBuilder.Register();

  10:    }

יש להצהיר על ה-background task ב- appmanifest של האפליקציה.

image

 

מספר הנחיות לשימוש נבון ב- background tasks:

כזכור, מודל ההפעלה של אפליקציות מטרו תוכנן על מנת לחסוך במשאבים ולספק למשתמש את חווית השימוש הטובה ביותר עם האפליקציה שמולה הוא עובד ברגע נתון (עקרון ה- fast and fluid) ולכן כדאי להקפיד ש-background tasks מתוכננים לביצוע משימות מוגדרות ומיידיות ואינם אמורים להריץ קוד "כבד" במשך זמן ארוך.

אפליקציית ה-foregound יכולה להרשם לאירועים הקשורים לביצוע של ה- background tasks שלה, דוגמת completion event, progress event.

ה- background task לא יכול לגשת לרכיבי ה- UI של האפליקציה ואם יש צורך לשתף מידע בין ה- background task וה- foreground app יש לעשות זאת באמצעות שימוש ב- storage.

 

סיכום

background taks מאפשרים לאפליקציה להמשיך ולהיות פעילה גם כאשר האפליקציה אינה רצה ומאפשרים ביצוע תסריטים חשובים כמו קבלת או משיכת עדכונים מהשרת, התמודדות עם מצב שבו זמינות הרשת משתנה ואפילו ביצוע פעולות נדרשות לאחר עדכון גרסה של המערכת (באמצעות ServicingComplete system event).

כברירת מחדל windows 8 מספק ל- background tasks של המערכת host נפרד מה- executable של האפליקציה. Host זה המנוהל על ידי מערכת ההפעלה ומופעל על ידה כאשר מתרחש האירוע שנרשם ל-task ומתקיימים כל התנאים להפעלותו.

לקריאה מקיפה יותר בנושא ודוגמאות קוד ניתן להוריד את ה- white paper הזה.

לשאלות נוספות אתם מוזמנים להגיב או להתייעץ עם מומחי הקהילה בפורום החדש של פיתוח אפליקציות מטרו לווינדוס 8.

מחזור החיים של אפליקציית מטרו ל- Windows 8הפוסט נכתב ע"י מאיה שנהב, יועצת בכירה בקבוצת היועצים של מיקרוסופט
(MCS ) העוסקת בייעוץ בתחומי ארכיטקטורה, פיתוח, Azure ו- ALM.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. (*) שדות חובה מסומנים

תגובה אחת

  1. שלומי הסן19 ביולי 2012 ב 22:59

    פוסט מעולה כרגיל את לא מאכזבת
    תענוג לקרוא את סדרת הפוסטים שלך בנושא זה

    להגיב