Kiedy używam wątków do drukowania rzeczy na konsoli, dlaczego powoduje to nieparzyste wyniki?

Ostatnio wcielałem się w wątki, czytając bardzo fajny plik pdf z Roba Milesa (tutaj). Miał przykład na stronie 160 (2012, C # pdf), ale nie napisał do konsoli tylko zrobił puste pętle.

Napisałem bardzo prostą pętlę do tworzenia wątków, która tworzy 10 wątków, które zapisują swoje identyfikatory na ekranie przy każdej wielokrotności 1000. To było miłe - pokazało mi, jak działają wątki razem. Moje pytania zaczynają się od tego, dlaczego moje dane wyjściowe są tak zmieszane? Często, gdy uruchamiam poniższy program, otrzymuję wiele linii „Wątek 3 zakończony”, w których jestem pewien, że powinienem mieć tylko jeden z nich.

Dodałem"zamek" z MSDN do pętli, ale nadal wydaje się, że produkuje nieparzyste dane wyjściowe (podam przykład poniżej).

    namespace ConsoleApplication1
    {
        class Program
        {
            static object sync = new object();

            static void Main(string[] args)
            {
                for (int i = 0; i < 10; i++)
                {
                    Thread myThread = new Thread(() => DoThis(i));
                    myThread.Start();
                }
                Console.ReadLine();
            }

            static void DoThis(int s)
            {
                lock (sync) // a new addition that hasn't helped
                {
                    for (long j = 0; j < 10000; j++)
                    {
                        if (j % 1000 == 0) Console.Write(String.Format("{0}.", s));
                    }
                    Console.WriteLine("\r\nThread {0} Finished", s);
                    Debug.Print("\r\nThread {0} Finished", s); //<-- added to debug

                }
            }
        }
    }

Myślałem, że dobrze sobie radzę - mam zmienne lokalne (moja pętla zliczająca), mam int, który prawdopodobnie przekazywany jest nie przez odniesienie, a później próbowałem go zablokować podczas wykonywania pętli. Bez radości. Co powinienem zrobić, aby wygląd wyglądał rozsądnie? Próbowałem rozwiązać problem z Deubg.Print, ale ma też błędy (poniżej).

Ostatecznie chcę używać wątkowania w większej aplikacji, ale jeśli nie mogę go uzyskać tutaj, nie jestem pewien, czy chcę!

Przykład Wyjście z linii debug.print na końcu: (zanotuj wielokrotności) ...

Thread 1 Done
The thread '<No Name>' (0x15cc) has exited with code 0 (0x0).

Thread 9 Done
The thread '<No Name>' (0x1d0c) has exited with code 0 (0x0).

Thread 6 Done
The thread '<No Name>' (0x2248) has exited with code 0 (0x0).

Thread 10 Done
The thread '<No Name>' (0x22bc) has exited with code 0 (0x0).

Thread 9 Done
The thread '<No Name>' (0x85c) has exited with code 0 (0x0).

Thread 9 Done
The thread '<No Name>' (0x1628) has exited with code 0 (0x0).

Thread 3 Done
The thread '<No Name>' (0x2384) has exited with code 0 (0x0).

Thread 6 Done

Thread 2 Done

Thread 4 Done
The thread '<No Name>' (0x2348) has exited with code 0 (0x0).
The thread '<No Name>' (0x2420) has exited with code 0 (0x0).
The thread '<No Name>' (0x1ea8) has exited with code 0 (0x0).

Daj mi znać, jeśli mogę zaoferować więcej informacji o tym, co próbowałem.

questionAnswers(2)

yourAnswerToTheQuestion