2017-03-09 111 views
-1

我有一個控制檯應用程序,它運行時通過谷歌smtp客戶端發送電子郵件。如何知道是否有活動的線程?

代碼如下:

private void SendEmailThread(MailMessage message) 
{ 
    Thread thread = new Thread(() => _mailService.SendEmail(message)); 
    thread.Start(); 
    thread.Join(); 
} 

我怎麼知道,當所有線程都完成了?

當全部完成後,是否有一個全局屬性設置爲ThreadsRunning = 0

我想在所有電子郵件發送完畢並且沒有更多線程時完成消息發送到控制檯。

喜歡的東西:

if(allThreadsDone){ 
    Console.WriteLine("All mails are sent"); 
} 
+0

請參閱以下問題:[掛起並通知線程有工作要做時](http://stackoverflow.com/questions/210020/suspending-and-notifying-threads-when-there-is-work-to-做)和[C#相當於Java的等待和通知?](http://stackoverflow.com/questions/209281/c-sharp-equivalent-to-javas-wait-and-notify)。如果您不想要專用的電子郵件發件人線程,請查看['Task.Run'](https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task.run.aspx) 。 – Romoku

+1

從它的外觀來看,你的代碼與'_mailService.SendEmail(message);'基本相同,因爲你使用'Join'來等待線程完成。 – TheLethalCoder

+0

來自MSDN:阻止調用線程,直到此實例表示的線程終止,同時繼續執行標準COM和SendMessage抽取。 – TheLethalCoder

回答

3

你的代碼實際上是同步運行(或多或少)。這是因爲Thread.Join會阻塞調用線程,直到另一個線程結束。或如MSDN所說的那樣:

塊調用線程,直到此實例所表示的線程終止,同時繼續執行標準的COM和SendMessage消息

所以基本上所有你需要做的是SendEmailThread最後一次通話後,只打印您的留言:

Console.WriteLine("All mails are sent"); 

對於你正在努力實現我建議你看看Task.WhenAll什麼。你的情況是這樣的:

var tasks = new List<Task>(); 
foreach (var message in messages) 
{ 
    tasks.Add(Task.Run(() => _mailService.SendEmail(message))); 
} 

Task waiter = Task.WhenAll(tasks); 
try 
{ 
    waiter.Wait(); 
} 
catch {} 

if (waiter.Status == TaskStatus.RanToCompletion) 
{ 
    Console.WriteLine("All messages sent."); 
} 
else 
{ 
    Console.WriteLine("Some messages failed to send."); 
} 
+0

有點快接受這一點。試過你的soloution,它不起作用。我正在使用smptp客戶端的SendAsync方法,在發送消息之前執行上面的代碼 – ThunD3eR

+1

@ Ra3IDeN上面的代碼是如何執行您想要的操作的示例。您從未指定方法在您的問題中是'async',將來會提供[MCVE]。因爲我不知道代碼的其餘部分是什麼樣的,所以這是一個如何實現這個目標的例子,我相信你可以根據自己的需要來定製它。正如這裏提到的很多,這不是一個代碼寫入服務。 – TheLethalCoder

+0

從來沒有預料到這個m8的代碼服務。正如我在問題中詢問是否想知道我的所有線程是否完成一樣。 沒想到我需要更多的代碼,然後我提供了 – ThunD3eR

-3

你可以有靜態值:

public static int ThreadCount = 0; 

,並在每次由1產卵這個變量的新線程的增加值時,做相反,當線程是「完成」或退出並將值減1。

當ThreadCount爲== 0時,您知道沒有線程存活,即。全部完成狀態。

你也可以爲系統編寫邏輯來觀察這個變量,當它升起時你知道線程開始工作。

我希望這可以幫助你。

+0

這可能工作,但它是一個可以解決的問題一個可怕的解決方法。更不用說所有的鎖定,你將不得不這樣做等。 – TheLethalCoder

+0

我做了這個作爲我的第一次嘗試,但我希望在這裏的事情是,如果有一個全球參數,持有這對我來說。如果有一個布爾值getss打開/關閉,當沒有更多的線程 – ThunD3eR

+0

@TheLethalCoder是的,我知道這是可怕的方式來做到這一點,這並沒有使它「壞」。 –

相關問題