如何知道是否有活动线程?

时间:2017-03-09 16:52:23

标签: c# multithreading

我有一个控制台应用程序,当它运行时通过googles 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");
}

2 个答案:

答案 0 :(得分: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.");  
}

答案 1 :(得分:-3)

您可以拥有静态值:

public static int ThreadCount = 0;

并且每当你将这个变量的新线程增加值增加1时,当线程是&#34;完成时#34;或退出并减少1的值。

当ThreadCount为== 0时,你知道没有线程活着,即。所有完成状态。

您还可以为系统编写逻辑以观察该变量,当它上升时,您知道线程开始工作。

我希望这会对你有所帮助。

相关问题