×
Namespaces

Variants
Actions

How to manage the 25 seconds available of a periodic background task(Arabic)

From Nokia Developer Wiki
Jump to: navigation, search

وهذا المقال يوضح كيفية إدارة 25 ثانية التي تقدمها PeriodicTask بكفاءة لتنفيذ عمليات كبيرة مثل إرسال البيانات الكبيرة إلى الخادم.

SignpostIcon XAML 40.png
WP Metro Icon WP8.png
SignpostIcon WP7 70px.png
SignpostIcon Code 52.png
Article Metadata
Tested with
Devices(s): Nokia Lumia 820
Compatibility
Platform(s): Windows Phone 8, Windows Phone 7
Windows Phone 8
Windows Phone 7.5
Article
Keywords: PeriodicTask, BackgroundAgent, ScheduledAgent
Translated:
By bintk
Last edited: hamishwillee (04 Jul 2013)

المقدمة

  • وثائق كما تذكر ، نظام ويندوز فون يوفر لك فقط 25 ثانية لإكمال عملك على إطلاق PeriodicTask. بعد تلك 25 ثانية، سيتم إنهاء PeriodicTask تلقائيا بغض النظر عن عملك اكتمال أو لا. الآن ما إذا كان لديك بعض العمليات الكبيرة التي يتعين القيام بها والتي قد تستغرق وقتا أطول من 25 ثانية؟ والجواب هو ما تحتاجه لإدارة ذلك بنفسك. تفعل كل ما تستطيع، وتأكد من حفظ العمل قبل التراجع مرة أخرى 25 ثانية يحصل على أكثر بحيث يمكنك استئناف الأشياء في وقت لاحق عندما يتم تشغيل المهمة دوريا مرة أخرى. هنا هو كيف يمكنك أن تفعل ذلك.
  • تقسيم 25 ثانية إلى جزئين ، مثلاً عملية التوقيت وتوفير الوقت.
  • وقت العملية هو الوقت التي كنت تنوي تنفيذ العمليات خلالة . هذه المرة يمكن أن تتراوح 20-23 ثانية اعتمادا على توفير الوقت.
  • توفير الوقت هو الوقت المخصص لعودة العمل و عملية التراجع الخاص بك. يمكن أن تختلف من 2-5 ثواني اعتمادا على كمية البيانات المطلوبة ليتم حفظها.


الخطوات

وسوف تستفيد من المؤقت كلاس المقدمه في مكبته ويندوز فون التي توفر تنفيذ الأوامر بعد فاصل زمني محدد .

Timer stopWorkTimer;
long operationTime = 20;
protected override void OnInvoke(ScheduledTask task)
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
stopWorkTimer = new Timer(stopWorkTimer_Tick, null, TimeSpan.FromSeconds(operationTime), TimeSpan.FromMilliseconds(-1));
});
 
//load data from isolated storage and Perform operations here
 
NotifyComplete(); //notify complete will be called if operations are done before operationTime is over, making sure stopWorkTimer do not ticks
}
 
private void stopWorkTimer_Tick(object state)
{
//Save back remaining stuff to isolated storage here
 
Abort(); //abort will be called if ''Operation Time'' gets over
}

Note.pngNote: تحتاج إلي ان يكون لديك آلية للتراجع عن الخفظ و الأستئناف في المرة التالية لتشغيل التطبيق بأستخدام الكود أعلاة .


Real World Scenario

النهج المذكور أعلاه هو معمم لجميع أنواع العمليات. دعونا نلقي السيناريو العالم الحقيقي نموذجي لتقديم مشكلتنا. لدينا تطبيق والتي تحافظ على توليد أوامر اعتمادا على إجراءات المستخدم وتلك الأوامر يحتاج ليتم إرسالها إلى الملقم. في حال لم يكن لديك شبكة نكتب لهم IsolatedStorage والاحتفاظ بها للإرسال في وقت لاحق وإذا تم إغلاق التطبيق نرسل تلك الأوامر في الخلفية باستخدام BackgroundAgents (PeriodicTask).

نحن لا نعرف كم من الوقت يمكن أن تكون قائمة الأوامر في وقت واحد. ذلك يعتمد على توفر الشبكة على الهاتف المستخدم. وبالنظر إلى حقيقة أنه من الممكن جدا للمستخدم ليكن لديك شبكة لبضعة أيام، سوف CommandsList تنمو ضخمة ولإرسال هذه الأوامر في الخلفية، 25 ثانية لا تكفي. لذلك سوف نستخدم لدينا وقت العملية وتوفير الوقت مفهوم لإرسال هذه الأوامر. ولكن قبل ذلك علينا أن لديها أقل من الأشياء في مكانها.

آلية لحفظ / تحميل CommandsList من IsolatedStorage. A UniqueId يرتبط كل أمر. سوف خادم الرد مع UniqueId على تلقي الأوامر، والتي سوف تستخدم التطبيق لمعرفة أي أمر لحذف على الحصول على استجابة الخادم. الآن بعد الأشياء المذكورة أعلاه هي في مكان لدينا خياران لإنقاذ / تحميل CommandsList من IsolatedStorage.

تحميل CommandsList كله في الذاكرة مرة واحدة يتم تشغيل المهمة دوريا. كما أرسل العديد من الأوامر ممكن في عملية الوقت، ثم حذف الملف القديم من قائمة الأوامر IsolatedStorage وحفظ ظهر CommandsList المتبقية في توفير الوقت. تحميل أمر واحد فقط إما من أعلى / أسفل CommandsList من IsolatedStorage في الذاكرة، وإرساله إلى الخادم. حذفها من IsolatedStorage فقط بعد تلقي استجابة من خادم نجاح. النهج الأول هو أسرع لأنه يجعل اثنين فقط من عمليات الملفات، الأول أثناء قراءة CommandsList والثانية أثناء كتابة المتبقية مرة واحدة الى الوراء. تبقى من الوقت فإنه يقرأ / يكتب إلى ذاكرة RAM. لذلك سوف تستخدم عملية الوقت بشكل أكثر كفاءة. ولكن منذ أن تكتب مرة أخرى أوامر لتخزين فقط في توفير الوقت، في حالة بعض الخطأ غير معالج التي تحدث في عملية التوقيت يسبب فشل سوف العودة الى الكتابة أوامر إلى IsolatedStorage جعل عدد قليل من الأوامر المرسلة إلى ملقم مرتين.

النهج الثاني هو أبطأ قليلا كما يقرأ / يكتب إلى ملف في الوقت الذي ترسل كل أمر. ولكن سوف نتأكد من يتم إرسال أي من أوامر مرتين إلى الملقم.

Note.pngNote: في حال كنت أذهب للنهج الثاني، وسوف تحتاج فقط لاستدعاء Abort() في Timer لإستدعاء الأوامر الموجودة بالفعل في الذاكرة IsolatedStroage

Now we are set to send Commands in background. Follow below steps in OnInvoke() of your ScheduledTask.

  • Instantiate the Timer to tick after Operation Time.
  • Either load all or one Command from IsolatedStorage depending on approach you followed and start sending them to server.
  1. if all Commands are sent call NotifyComplete() which will cause SheduledAgent to terminate and hence Timer will never Tick.
  2. if Operation Time gets over, Timer will tick indicating start of Saving Time. Save remaining Commands back to IsolatedStorage.
This page was last modified on 4 July 2013, at 08:53.
72 page views in the last 30 days.
×