2012-04-17 107 views
1

我非常缺乏經驗的利用多線程技術,但這裏是我曾嘗試:C#生成新線程,然後等待

Thread thread = null; 

for (int minute = 0; minute < 60; minute++) 
{ 
    Thread.Sleep(60000); 

    if (thread != null) 
    { 
     while (thread.ThreadState == ThreadState.Running) { } 
    } 

    thread = new Thread(delegate() 
    { 
     // Do stuff during the next minute whilst the main thread is sleeping. 
    }); 
    thread.Start(); 
} 

我想在這裏實現的是有一個線程在運行,做在主線程休眠時工作,但我不確定爲什麼上面的代碼不起作用。會發生什麼是在第一個循環之後(在啓動線程之後),ThreadState似乎沒有從「Running」中改變。我也很好奇這是否有更優雅的方式。

有人知道這個問題嗎?

+0

感謝所有的答案,但也許不清楚我想達到什麼。我想運行線程委託中給出的代碼,而主線程睡眠一分鐘,但如果新線程在這一分鐘內沒有完成,那麼主線程將在創建另一個新線程之前等待它完成。這是必需的,以便分鐘數儘可能接近真實分鐘。 – TheBoss 2012-04-17 05:23:17

+0

嗯..仍然沒有得到它。你說的是主線程應該等到產生的線程結束,但至少要一分鐘?是對的嗎? – harri 2012-04-17 05:52:33

+0

下面是過程應該如何進行的:在for循環的第一次迭代中,主線程將等待1分鐘,之後它將創建一個新線程來並行執行任務。開始這個新線程後,它會再次迭代,主線程休眠1分鐘,然後如果並行任務[奇怪]在那一分鐘內沒有完成任務,它將等待它完成。一旦並行任務完成後,它將創建一個新的線程等。 – TheBoss 2012-04-17 12:30:52

回答

4

Thread.Join是等待線程結束的更好方法。

+0

我的代碼中實際存在一個問題,導致並行代碼無限期地運行。我實施了這個,謝謝。 – TheBoss 2012-04-17 12:54:03

0

Thread.Sleep(60000)在調用它的線程上執行,在這種情況下是主線程。這很好,但「線程」不知道它已經運行了多長時間,也不知道何時停止。你需要有一個對象告訴「線程」它已經運行了60秒。

Thread thread = null; 

for (int minute = 0; minute < 60; minute++) 
{ 
    if (thread != null) 
    { 
     while (thread.ThreadState == ThreadState.Running) { } 
    } 

    thread = new Thread(delegate() 
    { 
     try 
     { 
      // Do stuff during the next minute whilst the main thread is sleeping. 
     } 
     catch (ThreadAbortException ex) 
     { 
     } 
    }); 
    thread.Start(); 
    Thread.Sleep(60000); 
    thread.Abort(); 
} 

這應該達到你想要的,但並不是真正停止線程的最優雅方式。一個線程應該使用回調來結束。

2

如果您使用的是.Net 4,我建議您查看Task Class。它使多線程的工作更容易/直接。

0

你可能會尋找更多的東西是這樣的:

Thread thread = new Thread(delegate() 
    { 
     // Something that takes up to an hour 
    }); 
thread.Start(); 

for (int minute = 0; minute < 60; minute++) 
{ 
    Thread.Sleep(60000); 
    if (thread.IsAlive) 
     Console.WriteLine("Still going after {0} minute(s).", minute); 
    else 
     break; // Finished early! 
} 

// Check if it's still running 
if (thread.IsAlive) 
{ 
    Console.WriteLine("Didn't finish after an hour, something may have screwed up!"); 
    thread.Abort(); 
} 

如果這是你在找什麼,我想看看在BackgroundWorker類。

1

使用Task類可以做到這一點。

Task task = Task.Factory.StartNew(() => 
    { 
    // Do stuff here. 
    }); 

task.Wait();