2015-04-02 59 views
0

我正在關注this screencast on multithreadingc#中的簡單線程無法正常工作

在分鐘12:13的視頻說,該程序應該在名稱爲t的線程上運行循環,然後從主線程運行代碼。所以在輸出中,我應該看到ThreadProc 0 - 9,然後是來自主線程的4次消息 - 正好與我所知道的相反。

問題是什麼錯。根據屏幕錄像,代碼看起來很相似。

的代碼:

namespace Objective_1._1 { 


    internal class Program 

{ 
    public static void ThreadMethod() 
    { 
     for (var i = 0; i < 10; i++) 
     { 
      Console.WriteLine("ThreadProc {0}", i); 
      Thread.Sleep(0); 
     } 
    } 

    public static void Main() 
    { 
     var t = new Thread(ThreadMethod); 
     t.Start(); 

     // Loop on the main thread 
     for (var i = 0; i < 4; i++) 
     { 
      Console.WriteLine("Main thread: Do some work"); 
      Thread.Sleep(0); 
     } 

     //Do not pass this line of code and exit the main until thread t finish 
     t.Join(); 
    } 
} } 

當用戶運行它,則結果如下:

enter image description here

EDIT

結果與

Thread.sleep代碼(5)

在主

enter image description here

編輯2

預期結果:

enter image description here

+0

將主睡眠改爲睡眠(5) - 僅看 – pm100 2015-04-02 15:44:13

+0

您需要在啓動子線程之後在主線程上執行非零睡眠以允許其首先運行。如果你的循環中有更長的睡眠時間,那可能會更有趣。 – juharr 2015-04-02 15:44:47

+1

在應用程序中使用睡眠通常意味着線程開始的思路很差,但如果您必須;使用.sleep(1)作爲睡眠(0)是有問題的。 – Wobbles 2015-04-02 15:46:32

回答

2

由於您正在進行多線程處理,因此不保證線程的順序是什麼,而不會給線程更高的優先級。僅僅因爲你希望你的線程先運行,然後主線程完成,國際海事組織,打敗了多線程的目的。你可能不會產生一個線索開始。就像Yair Nevet所說的那樣,主線程在你的線程初始化和啓動之前一直運行。對於「真正的」多線程,我預計你的輸出會混合在一起,但是不能保證像pm100所評論的那樣。

現在要回答有關在主線程之前完成線程完成的問題,請將Thread.Join()移至主線程中for循環的上方,然後您將獲得所需的預期輸出。

0

所以在輸出I應該看到ThreadProc的0 - 從主線程4次消息 9,則 - 正好和我所知道的相反。

你第一次看到來自主線的寫,因爲時間初始化子線程需要一段時間,後來開始 - 與此同時,主線程繼續運行,並儘自己的操作。