Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道是否有任何活动线程?_C#_Multithreading - Fatal编程技术网

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

C# 如何知道是否有任何活动线程?,c#,multithreading,C#,Multithreading,我有一个控制台应用程序,当它运行时通过谷歌smtp客户端发送电子邮件 代码: private void SendEmailThread(MailMessage message) { Thread thread = new Thread(() => _mailService.SendEmail(message)); thread.Start(); thread.Join(); } 如何知道所有线程何时完成 完成所有操作后,是否有全局属性设置为ThreadsRunni

我有一个控制台应用程序,当它运行时通过谷歌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");
}
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.");  
}
您的代码实际上(或多或少)是同步运行的。这是因为阻塞调用线程直到另一个线程结束。或者正如MSDN所说:

阻止调用线程,直到此实例表示的线程终止,同时继续执行标准COM和SendMessage泵送

因此,基本上您只需在最后一次调用
sendmailthread
后打印您的邮件即可:

Console.WriteLine("All mails are sent");
对于你想要实现的目标,我建议你仔细研究一下。在您的情况下,类似于:

if(allThreadsDone){
    Console.WriteLine("All mails are sent");
}
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.");  
}
var tasks=newlist();
foreach(消息中的var消息)
{
tasks.Add(Task.Run(()=>_-mailService.sendmail(message)));
}
任务服务员=Task.WhenAll(任务);
尝试
{
服务员,等等;
}
捕获{}
if(watter.Status==TaskStatus.RanToCompletion)
{
Console.WriteLine(“已发送的所有消息”);
}
其他的
{
WriteLine(“某些消息无法发送”);
}
您的代码实际上(或多或少)是同步运行的。这是因为阻塞调用线程直到另一个线程结束。或者正如MSDN所说:

阻止调用线程,直到此实例表示的线程终止,同时继续执行标准COM和SendMessage泵送

因此,基本上您只需在最后一次调用
sendmailthread
后打印您的邮件即可:

Console.WriteLine("All mails are sent");
对于你想要实现的目标,我建议你仔细研究一下。在您的情况下,类似于:

if(allThreadsDone){
    Console.WriteLine("All mails are sent");
}
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.");  
}
var tasks=newlist();
foreach(消息中的var消息)
{
tasks.Add(Task.Run(()=>_-mailService.sendmail(message)));
}
任务服务员=Task.WhenAll(任务);
尝试
{
服务员,等等;
}
捕获{}
if(watter.Status==TaskStatus.RanToCompletion)
{
Console.WriteLine(“已发送的所有消息”);
}
其他的
{
WriteLine(“某些消息无法发送”);
}

请参见以下问题:和。如果你不想要一个专用的电子邮件发送者线程,还可以查看一下。从外观上看,你的代码基本上与
\u mailService.sendmail(message)相同
因为您使用的是等待线程完成的
Join
。From MSDN:阻止调用线程,直到此实例所代表的线程终止,同时继续执行标准COM和SendMessage泵送。@在循环中调用了ethalcoder SendEmailThread方法。换句话说,我希望它能够连接到下一封电子邮件,即使当前邮件有延迟或出现故障。请看以下问题:和。如果你不想要一个专用的电子邮件发送者线程,还可以查看一下。从外观上看,你的代码基本上与
\u mailService.sendmail(message)相同
因为您使用的是等待线程完成的
Join
。From MSDN:阻止调用线程,直到此实例所代表的线程终止,同时继续执行标准COM和SendMessage泵送。@在循环中调用了ethalcoder SendEmailThread方法。换句话说,我希望它能够连接到下一封电子邮件,即使当前的邮件有延迟,或者如果有什么东西失败了,也能很快接受。尝试了你的解决方案,但它不起作用。我使用的是smptp客户机的SendAsync方法,上面的代码在消息实际发送之前执行sent@Ra3IDeN上面的代码是一个如何做你想要做的事情的例子。在您的问题中,您从未指定方法是
async
,以后请提供一个。由于我不知道您的代码的其余部分是什么样子,这是一个如何做到这一点的示例,我相信您可以根据自己的需要定制它。正如这里经常提到的,这不是一个代码编写服务。从来没有想过这个m8会有一个代码服务。正如我在问题中所问的,我正在寻找一种方法来知道我的所有线程是否都完成了。不认为我需要更多的代码,然后我provided@Ra3IDeN如果方法是
async
,您应该
任务中等待它
,尽管我没有在这些方面做太多的尝试,所以我无法进一步帮助您。接受这一点有点快。尝试了你的解决方案,但它不起作用。我使用的是smptp客户机的SendAsync方法,上面的代码在消息实际发送之前执行sent@Ra3IDeN上面的代码是一个如何做你想要做的事情的例子。在您的问题中,您从未指定方法是
async
,以后请提供一个。由于我不知道您的代码的其余部分是什么样子,这是一个如何做到这一点的示例,我相信您可以根据自己的需要定制它。正如这里经常提到的,这不是一个代码编写服务。从来没有想过这个m8会有一个代码服务。正如我在问题中所问的,我正在寻找一种方法来知道我的所有线程是否都完成了。不认为我需要更多的代码,然后我provided@Ra3IDeN如果方法是
async
,您应该
任务中等待它
,尽管我还没有在这些方面做太多的尝试,因此无法进一步帮助您。