我有一个控制台应用程序,当它运行时通过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");
}
答案 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时,你知道没有线程活着,即。所有完成状态。
您还可以为系统编写逻辑以观察该变量,当它上升时,您知道线程开始工作。
我希望这会对你有所帮助。