سؤال

لدي بعض التعليمات البرمجية لبدء سلسلة محادثات على .NET CF 2.0:

ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();

إذا قمت باستدعاء هذا داخل حلقة فإن العناصر خارج الترتيب تمامًا.كيف يتم تقديم الانتظار بعد t.Start(), ، بحيث يكتمل العمل على الخيط قبل أن يستمر الكود؟هل سيكون BeginInvoc/EndInvoce خيارًا أفضل لهذا من إنشاء سلاسل الرسائل يدويًا؟

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

المحلول

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

// Start all of the threads.
List<Thread> startedThreads = new List<Thread>();
foreach (...) {
  Thread thread = new Thread(new ThreadStart(MyMethod));
  thread.Start();
  startedThreads.Add(thread);
}

// Wait for all of the threads to finish.
foreach (Thread thread in startedThreads) {
  thread.Join();
}

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

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

نصائح أخرى

هناك طريقة أخرى لانتظار انتهاء سلسلة المحادثات وهي استخدام AutoResetEvent.

private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false);

private void Blah()
{
    ThreadStart tStart = new ThreadStart(MyMethod);
    Thread t = new Thread(tStart);
    t.Start();

    //... (any other things)
    mWaitForThread.WaitOne();
}

private void MyMethod()
{
     //... (execute any other action)
     mWaitForThread.Set();
}

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

إذا كانت هذه هي الحالة، فأنا لست متأكدًا من سبب قيامك بإنشاء سلسلة رسائل لكل عنصر عمل.ربما يمكنك التوسع؟

إذا كنت بحاجة إلى الانتظار حتى يكتمل الموضوع، فيمكنك فقط القيام بما يلي:

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