سؤال

هذا النوع يتبع من آخر سؤال خاصتي.

في الأساس، بمجرد حصولي على رمز الوصول إلى الملف (سوف أراجع الإجابات هناك خلال دقيقة واحدة)، ما هي أفضل طريقة للقيام بذلك امتحان هو - هي؟

أفكر في إنشاء طريقة تولد الكثير من الأشياء تطبيقBackgroundWorker's أو شيء ما ويخبرهم جميعًا بتحميل/حفظ الملف واختباره بأحجام مختلفة للملفات/الكائنات.بعد ذلك، احصل على رد من المواضيع لمعرفة ما إذا كانت قد فشلت/نجحت/تسببت في انهيار العالم وما إلى ذلك.

هل يمكنكم يا رفاق تقديم أي اقتراحات حول أفضل طريقة للتعامل مع هذا الأمر؟كما قلت من قبل، كل هذا جديد بالنسبة لي :)

يحرر

التالي ajmasterean's بريد:

أنا أستخدم تطبيق وحدة التحكم للاختبار باستخدام Debug.Asserts :)


تحديث

لقد توالت في الأصل باستخدام تطبيقBackgroundWorker للتعامل مع الخيوط (بما أنني اعتدت على ذلك من Windows dev) سرعان ما أدركت أنه عندما كنت أقوم بإجراء اختبارات حيث يلزم إكمال عمليات متعددة (سلاسل) قبل المتابعة، أدركت أنه سيكون بمثابة اختراق إلى حد ما الحصول عليه للقيام بذلك.

ثم تابعت com.ajmastereanمنشور وأدركت أنه يجب علي حقًا استخدام خيط فئة للعمل مع العمليات المتزامنة.سأقوم الآن بإعادة البناء باستخدام هذه الطريقة (وإن كان ذلك بطريقة مختلفة).

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

المحلول

في الشباك، ThreadPool لن تعود المواضيع دون الإعداد ManualResetEventق أو AutoResetEventس.أجد هذه المبالغة في طريقة الاختبار السريع (ناهيك عن نوع التعقيد في الإنشاء والتعيين والإدارة).يعد عامل الخلفية أيضًا معقدًا بعض الشيء مع عمليات الاسترجاعات وما شابه.

شيء وجدته يعمل

  1. إنشاء مجموعة من المواضيع.
  2. إعداد ThreadStart طريقة كل موضوع.
  3. ابدأ كل موضوع.
  4. الانضمام إلى جميع سلاسل الرسائل (يحظر مؤشر الترابط الحالي حتى تكتمل جميع سلاسل الرسائل الأخرى أو يتم إحباطها)
public static void MultiThreadedTest()
{
    Thread[] threads = new Thread[count];

    for (int i = 0; i < threads.Length; i++)
    {
        threads[i] = new Thread(DoSomeWork());
    }

    foreach(Thread thread in threads)
    {
        thread.Start();
    }

    foreach(Thread thread in threads)
    {
        thread.Join();
    }
}

نصائح أخرى

@ajmasrean، نظرًا لأن نتيجة اختبار الوحدة يجب أن تكون متوقعة، فنحن بحاجة إلى مزامنة سلاسل الرسائل بطريقة ما.لا أستطيع رؤية طريقة بسيطة للقيام بذلك دون استخدام الأحداث.

لقد وجدت أن ThreadPool.QueueUserWorkItem يمنحني طريقة سهلة لاختبار حالات الاستخدام هذه

 ThreadPool.QueueUserWorkItem(x => { 
    File.Open(fileName, FileMode.Open);
    event1.Set(); // Start 2nd tread;
    event2.WaitOne(); // Blocking the file;
});
ThreadPool.QueueUserWorkItem(x => { 
    try
    {
        event1.WaitOne(); // Waiting until 1st thread open file
        File.Delete(fileName); // Simulating conflict
    }
    catch (IOException e)
    {
        Debug.Write("File access denied");
    }
});

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

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