نتائج غير متناسقة عند تنفيذ والتفريخ الطفل المهام

StackOverflow https://stackoverflow.com/questions/994055

سؤال

لدي بعض التعليمات البرمجية البسيطة التي الخيط الرئيسي هو إنشاء مهمة جديدة.المهمة بدوره يولد الطفل متعددة المهام.موضوع الرئيسي لا 'الانتظار' على الأصل المهمة.أنا لاحظت أن كنت لا تحصل على نفس الناتج عبر أشواط متعددة من البرنامج.في البرمجية أدناه أنا طبع قيمة التكرار متغير في كل مهمة ولكن عبر مختلف أشواط فقط مجموعات فرعية على طباعتها.أنا أفهم أن التنفيذ لم يؤمر إلا أنه لا يزال يجب أن تكون كاملة في أن أتوقع 100 الأرقام للحصول على طباعة(في أي ترتيب معين).هل تدعو الانتظار لا ينتظر كل طفل المهام كاملة ؟ أنا على التوالي VS2010 فريق النظام Beta1

 static void Main(string[] args)
    {
        Console.WriteLine("Main executing on ThreadID:- " + Thread.CurrentThread.ManagedThreadId.ToString());

        var task = Task.Factory.StartNew(WriteNumbers);
        task.Wait();

    }

    private static void WriteNumbers()
    {
        Console.WriteLine("WriteNumbers executing on ThreadID:- " + Thread.CurrentThread.ManagedThreadId.ToString());
        for (int i = 0; i < 100; i++)
        {
            int localInt = i;
            Task.Factory.StartNew(() => 
                {
                   Write(localInt);
                }, TaskCreationOptions.DetachedFromParent);
        }
    }

    private static void Write(int i)
    {            
        Console.WriteLine("Worker Thread executing on ThreadID:-" + Thread.CurrentThread.ManagedThreadId.ToString() + " Value:" + i.ToString());
    }
هل كانت مفيدة؟

المحلول

في MSDN, أنت بحاجة إلى مزيد من الانتظار أو مزامنة أخرى وأنا أقتبس:""" عند الانتظار في مهمة ، ضمنا الانتظار على جميع الأطفال من هذه المهمة إلا إذا كان هؤلاء الأطفال تم إنشاؤها باستخدام DetachedFromParent الخيار.أي منفصلة يجب أن يكون الأطفال انتظرت على حدة."""

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

نصائح أخرى

خطأي: لقد استخدمت عن طريق الخطأ خيار detachedfromparent عند إنشاء الأطفال

 Task.Factory.StartNew(() => 
            {
               Write(localInt);
            }, TaskCreationOptions.DetachedFromParent);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top