私のproblem hereの続きで、ThreadPool
スレッドを使用して電子メールを送信するテストアプリケーションを作成しました。ここに私が使用しているコードがあります。ThreadPoolとメモリ(BTStackServer)例外 - .NET
それが作成:小さい数字(10K、50K)彼らは素晴らしい仕事が、私は(私のターゲットである)200Kに数を増やしたら、私はこの例外を得たために
protected void btnSend_Click(object sender, EventArgs e)
{
EmailInfo em = new EmailInfo { Body = "Test", FromEmail = "[email protected]", Subject = "Test Email", To = "[email protected]" };
//txtNumEmails is a textbox where I can enter number of emails to send
for (int i = 0; i < Convert.ToInt32(this.txtNumEmails.Text); i++)
{
bool bResult = ThreadPool.QueueUserWorkItem(new WaitCallback(EmailNow), em);
}
}
public void EmailNow(object emailInfo) // Email Info object
{
EmailInfo em = emailInfo as EmailInfo;
SmtpClient client = new SmtpClient("localhost");
client.UseDefaultCredentials = true;
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
client.PickupDirectoryLocation = @"C:\temp\testemails\";
MailMessage m = new MailMessage();
m.To.Add(new MailAddress(em.To));
m.Body = em.Body;
m.IsBodyHtml = false;
m.From = new MailAddress(em.FromEmail);
m.Subject = em.Subject;
client.Send(m);
}
この例外を投げた前の約186kメール。
私はすべての電子メールをC:\temp\testemails
にローカルに保存していますが、RAM(?)が少ないため例外ではないと仮定しています。this userで示唆されているように、私はセマフォ10Kにそれらを制限するが、それでも同じ問題に走った。ここではセマフォとの1のためのコードです。
protected void Button1_Click(object sender, EventArgs e)
{
EmailInfo em = new EmailInfo { Body = "Test", FromEmail = "[email protected]", Subject = "Test Email", To = "[email protected]" };
var semaphore = new SemaphoreSlim(10000, 10000);
for (int i = 0; i < Convert.ToInt32(this.txtNumEmails.Text); i++)
{
semaphore.Wait();
bool bResult = ThreadPool.QueueUserWorkItem((state) => {
try
{
EmailNow(em);
}
catch (Exception)
{
throw;
}
finally
{
semaphore.Release();
}
}, null);
}
}
この1つは、同様に例外を投げたが、私は、フォルダ内のすべての200Kのメールを確認してください。私がすることができますこの例外が発生した場合は、間違いなくtry catch
を使用して正常に終了しますが、最初にこの問題が発生するのを防ぐにはどうすればよいでしょうか。
Whoa ...これは通常のエラーではありません。このような致命的なクラッシュは、通常、CLRのバグ、アンマネージコードの不正行為、アンマネージドコードの不正使用などによって引き起こされます。私はDeepanshの2番目の提案をして、その 'SmtpClient'オブジェクトを処分してみてください。それ以外の場合は、クラッシュレポートを取得し、ヒントのスタックトレースを調べる必要があります。 –