2017-03-09 10 views
-1

私は、実行中に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

これらの質問を参照してください:[処理する必要があるときにスレッドを一時停止し、通知する](http://stackoverflow.com/questions/210020/suspending-and-notifying-threads-when-there-is-work-to- do)と[C#はJavaのwaitとnotifyに相当しますか?](http://stackoverflow.com/questions/209281/c-sharp-equivalent-to-javas-wait-and-notify)専用の電子メール送信者スレッドを必要としない場合は、['Task.Run'](https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.run.aspx)も参照してください。 – Romoku

+1

あなたのコードは、完了するためにスレッドを待つ 'Join'を使うので、あなたのコードは' _mailService.SendEmail(message);と本質的に同じです。 – TheLethalCoder

+0

MSDNから:このインスタンスが表すスレッドが終了するまで、呼び出し元のスレッドをブロックし、標準COMおよびSendMessageのポンピングを続行します。 – TheLethalCoder

答えて

3

あなたのコードは、実際に(多かれ少なかれ)を同期実行されています。これは、他のスレッドが終了するまでThread.Joinが呼び出しスレッドをブロックするためです。またはMSDNがそれを置くよう:標準COMとのSendMessageポンピングを実行するために継続しながら、このインスタンスで表されるスレッドは、終了

ブロック呼び出し側スレッドまで。あなたは私はあなたがTask.WhenAllに見える示唆達成しようとしている何のため

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

だから、基本的にあなたがする必要があるすべてはSendEmailThreadへの最後の呼び出しは、ちょうどあなたのメッセージを印刷した後です。あなたのケースでのようなもの:

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

これは私の最初の試みですが、ここでは私が望んでいることは、これを保持するグローバルパラメータがあるかどうかということです。スレッドがなくなったときにオン/オフになるブール値がある場合 – ThunD3eR

+0

@TheLethalCoderはいこれは恐ろしい方法ですが、それは「悪い」とは言えません。 –

関連する問題