سؤال

سؤال

ربما هذا شيء بسيط فاتني.

دعنا نقول أنني أفعل (في Loveley VB):

Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()

إشعار t1.continuewith يستخدم مرتين. ما هو ترتيب التنفيذ المفضل لهذه المهام؟ بالنسبة لي ، إنه إما عشوائي أو خطأ.

لماذا ا؟

السبب في أنني أريد أن أفعل هذا ...

  1. قم بإنشاء بيانات الاستيلاء على المهام وإرجاعها
  2. تليها مهمة "تفرز" واجهة المستخدم TaskScheduler.FromCurrentSynchronizationContext() (موضوع واجهة المستخدم)
  3. اتبع مهمة الاستيلاء على البيانات الأصلية عن طريق تحويل البيانات إلى تقرير طويل (يأخذ الأعمار)
  4. مرة أخرى على موضوع واجهة المستخدم ، قم بتعيين هذا التقرير إلى عنصر تحكم معاينة
  5. التنظيف (تخلص من الرسوم المتحركة الخاصة بي وما إلى ذلك)

هذا أصبح أكثر تعقيدًا بسبب حقيقة أن الخطوة 4 هي اختياري.

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

شكرا توم

هل كانت مفيدة؟

المحلول

يتم تنفيذ المهام في طلب LIFO للحصول على موقع أفضل للذاكرة. يمكن تغيير هذا بالطبع إذا كنت تستخدم جدولة مختلفة أو إذا قررت MS "إصلاح" الأصلي. لا أعتقد أنه يجب عليك الاعتماد على هذا السلوك. بدلاً من ذلك ، يمكنك فك مهمتك لمواصلة العمل في المهمة السابقة عند الانتهاء منها. وإلا فأنت تنتظر الشيء الخطأ. يمكن العثور على المزيد من Infos هنا: http://msdn.microsoft.com/en-us/library/ee795275.aspx

نصائح أخرى

إذا كنت ترغب في تطبيق الترتيب بين T2 و T3 ، فلماذا لا تتغير فقط بحيث يستمر T3 من T2 بدلاً من T1؟

Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t2.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()

إذا كان T2 و T3 على التوالي ، فسيتم تنفيذها بالتوازي كما كتبت.

ليست هناك حاجة لإنشاء جدولة مهمة مخصصة لتغيير هذا السلوك.

بناءً على تعليقك على إجابة إيان ميرسر ، أود أن أقترح شيئًا مثل

Task t1 = new Task((_)=>Console.WriteLine("t1"));
Task tn = secondTaskCondition ? t1.ContinueWith((_)=>Console.WriteLine("t2")) : t1;
Task t3 = tn.ContinueWith((_)=>Console.WriteLine("t3"));
t1.Start();

يمنحك هذا تنفيذًا حتميًا ولا يزال يتيح لك إنشاء سير العمل الخاص بك بوحدات اختيارية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top