私は電子メールを送信する小さな電子メールワーカーを構築しようとしています。電子メールワーカーは、独自のスレッドで動作します。 global.asaxはスレッドを開始し、この例外をスローする前に1ラウンド実行します。私はそれをどこに投げるかを調べようとしていますが、毎回違うようです。レコードはテキストファイルに出力されるので、おそらく処分関数ですか? forループ メールワーカーに寝るASP.NET C#スレッドが異常終了しましたか?
メール 労働者の新しいラウンドを開始するためのループ
タイプの最初のチャンス 例外:この例外がスローされますが 'System.Threading.ThreadAbortException' はがmscorlib.dll
例外に発生した 'System.Threading.ThreadAbortException'タイプ のはがmscorlib.dllで発生したが、これは、これがすべてを開始し、Global.asaxファイルであるEmailWorkerpublic static class EmailWorker { public static void Work() { TimeSpan sleepTime = new TimeSpan(0, 1, 0); for (; ;) { Debug.WriteLine("Starting a new round in the email worker for-loop"); try { // Get the records CS_Code.UtopiaDataContext db = new CS_Code.UtopiaDataContext(); List<CS_Code.Global_Email> emailsToSend = (from xx in db.Global_Emails select xx).ToList(); // Write the records to a file (for now) TextWriter writer = new StreamWriter(@"test.txt", true); // For debugging foreach (var email in emailsToSend) writer.WriteLine("To: " + email.Email_Address + ", Subject: " + email.Subject + ", uid:" + email.UserName.ToString()); writer.Close(); writer.Dispose(); // Delete the used records from the database foreach (var email in emailsToSend) db.Global_Emails.DeleteOnSubmit(email); db.SubmitChanges(); db.Dispose(); Debug.WriteLine("Going to sleep in the email worker for-loop"); Thread.Sleep(sleepTime); // Sleep for 1 minute. Debug.WriteLine("Just woke up in the email worker for-loop"); } catch (Exception e) { Debug.WriteLine(e.Message); break; } } } }
するためのコードでユーザーコードで
を扱っ いませんでした。
private static Thread EmailWorkerThread { get; set; }
void Application_Start(object sender, EventArgs e)
{
// Email worker thread
if ((EmailWorkerThread == null) || (!EmailWorkerThread.IsAlive))
{
ThreadStart ts = new ThreadStart(EmailWorker.Work);
EmailWorkerThread = new Thread(ts);
EmailWorkerThread.Start();
}
}
void Application_End(object sender, EventArgs e)
{
// Email worker thread
if ((EmailWorkerThread != null) || (EmailWorkerThread.IsAlive))
EmailWorkerThread.Abort();
EmailWorkerThread = null;
}
これは、24時間365日実行する必要があるものをASP.NETプロジェクトからWindowsサービスに移動する理由です。 –