2017-04-05 12 views
0

スレッドを使用してシングルメールを送信すると、きれいで高速です。foreachステートメント内のバックグラウンドスレッドを使用してASP.Netで電子メールを非同期で送信する方法

Thread TDemail = new Thread(delegate() 
{ 
    cm.SendEmail(cm); 
}); 

これは複数のメールを送信するためのコードです。私は、foreach文の中でバックグラウンドスレッドを使用して複数の電子メールを非同期的に送信したい。どんな助けも非常に高いです。

MailFunction cm = new MailFunction(); 
foreach (var clist in NewslettersList) 
{ 
    cm.To = clist.NewsletterEmail; 
    try 
    { 
     cm.SendEmail(cm); 
    } 
    catch (Exception) 
    { 
    } 
} 
+0

メール機能は何ですか? –

+0

'SendMail'は同期メソッドです。あなたのスレッドは、そのメソッドを実行すると実際にブロックされます。本当に非同期メソッドを持つためには、最初に 'SendMail'メソッドを変更する必要があります。 –

+0

https://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx – VMAtm

答えて

0

この

public static async Task ForEachAsync<T>(this IEnumerable<T> items, Func<T, Task> func) 
     { 
      foreach (var value in items) 
      { 
       await func(value); 
      } 
     } 

非同期この

MailFunction cm = new MailFunction(); 
await NewslettersList.ForEachAsync(async clist => 
      { 
       cm.To = clist.NewsletterEmail; 
       await cm.SendEmail(cm); 
      }); 
-1

タスクAPIを使用してのようにあなたのメールを送信するために使用のような非同期のForEach拡張を作成します。スレッドを使わないでください。 Task APIスケジューラは、電子メールが送信されたときにバックグラウンドスレッドを再利用します。

また、あなたはおそらく適切に例外を処理する必要が
HostingEnvironment.QueueBackgroundWorkItem(ct => 
{ 
    var cm = new MailFunction(); 
    foreach (var clist in NewslettersList) 
    { 
     cm.To = clist.NewsletterEmail; 
     try 
     { 
      cm.SendEmail(cm); 
     } 
     catch (Exception) 
     { 
     } 
    } 
}); 

、ないだけ:HostingEnvironment.QueueBackgroundWorkItem

MailFunction cm = new MailFunction(); 
foreach (var clist in NewslettersList) 
{ 
    cm.To = clist.NewsletterEmail; 
    Task.Run(() => 
    { 
     try { 
      cm.SendEmail(cm); 
     } catch (Exception) { 
     } 
    });      
} 
+0

ありがとうございます。それは働いている。しかし、ブログごとに - http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html Task.Factory.StartNewを使用することは非常に危険です。私はTask.Runを試してみて、完璧に働いています。 –

+0

'TPL'を' ASP.NET' – VMAtm

+0

の中で使ってはいけません。答えを受け入れるとTask.Run()を使って編集すると助けになります。 @WMAtmはコメントを書いて、コメントを書いているが、その解決策は彼の文脈の中では良さそうだ - 彼は他のすべてのものを抽象化した。 – John

0

あなたは完璧なブログpost from Scott Hanselman

必要に行う最も簡単な方法を見つけることができますですそれを捕まえて。 Task.Runについては、「Taskはなぜ終わったのですか」のように、ここで多くの質問を見つけることができます。 TPLの直接使用は、ASP.NETには独自のスレッドプール管理ロジックがあり、要求を処理した後にスレッドを中断することができるため、悪い習慣とみなされます。

関連する問題