2009-10-09 103 views
2

我有兩個輔助線程,即,如下所述執行方法WriteX:線程的執行實時仿真

static void Main(string[] args) 
    { 

     ThreadStart one = new ThreadStart(WriteX); 
     Thread startOne = new Thread(one); 
     ThreadStart two = new ThreadStart(WriteX); 
     Thread startTwo = new Thread(two); 
     startOne.Start(); 
     startTwo.Start(); 
     Console.ReadKey(true); 
    } 

    public static void WriteX() 
    { 
     for (int i = 1; i <= 3; i++) 
     { 
      Console.WriteLine("Hello"); 
      Thread.Sleep(1000); 
     } 
    } 

(1)如何可以通過「startOne」找到所花費的時間(以毫秒爲單位)和「startTwo」來完成它的任務? (2)我啓動了線程(Start())。在成功執行時,我不需要停止線程,否則將由主線程(在這種情況下爲Main())處理? (3)如何打印郵件說,startOne正在執行WriteX()方法,並且startTwo正在執行WriteX()方法?

回答

1

在每個嚴重的日誌框架中,可以在輸出消息中包含線程ID或線程名稱。如果您只想使用控制檯,則可能需要手動將當前線程ID /名稱附加到消息中。

像這樣:

public static void WriteX() 
{ 
    var sw = Stopwatch.StartNew(); 
    for (int i = 1; i <= 3; i++) 
    { 
     Console.WriteLine("Hello"); 
     Thread.Sleep(1000); 
    } 
    sw.Stop(); 
    Console.WriteLine("{0} {1}", 
         Thread.CurrentThread.ManagedThreadId, 
         sw.Elapsed); 
} 

要命名一個線程,只是使用的線程實例的名稱屬性:

ThreadStart one = new ThreadStart(WriteX); 
Thread startOne = new Thread(one); 
startOne.Name = "StartOne"; 

//... 

Console.WriteLine("{0} {1}", Thread.CurrentThread.Name, sw.Elapsed); 

而且,當方法傳遞爲ThreadStart構造函數的參數完成時,線程自動結束。如果要等待主線程中的線程結束,請使用Join方法。

+0

謝謝羅曼Verdier.Really有用。再次非常感謝你。 – user186973 2009-10-09 08:41:41

0
  1. WriteX()的東西,之前和之後保存當前時間(或者簡單地做它在開始和結束WriteX()),並打印在年底的差異。

  2. 當傳遞給ThreadStart完成的方法中,線程終止本身(和清除本身向上)

  3. 再次,在東西做日誌記錄包裹WriteX()。我建議查看ThreadStart的來源,看看它是如何實現的以及如何擴展/包裝它。

如果您不知道我在說什麼,this article可能會有所幫助。

+0

謝謝Aaron Digulla,我會做 – user186973 2009-10-09 08:36:10

0
  1. 這取決於您是否想要獲得兩個獨立任務的執行時間之和或最大的一個。在第一種情況下,您需要在WriteX中測量所需的時間。在startOne之前的第二種情況下,當兩個ar都完成時停止測量。在兩種情況下都使用Stopwatch

  2. 使用Thread.Join等待兩個線程都完成。

  3. 使用參數化的開始Thread.Start(object)並在那裏傳遞任務名稱。

+0

謝謝Dzmitry Huba。 :) – user186973 2009-10-09 08:42:51