2017-03-09 69 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是的,我知道这是可怕的方式来做到这一点,这并没有使它“坏”。 –

相关问题