時間がかかりすぎる場合Timer
はキャンセルする必要があります。Thread
System.Timers.Timer timer_timers = new System.Timers.Timer();
Thread thread = new Thread(startJob);
thread.Name = "VICTIM_THREAD";
Thread
メソッドを開始するときに、現在のスレッドを開始しTimer
、現在のスレッドをパラメーターとしてイベントに渡します。
public void startJob()
{
Debug.WriteLine("Name: " + Thread.CurrentThread.Name);
timer_timers.Elapsed += (sender, e) => T_Elapsed(sender, e, Thread.CurrentThread);
timer_timers.Interval = 5000;
// Start simulation process
while (true)
{
Thread.Sleep(700);
Debug.WriteLine("Thread: " + Thread.CurrentThread.Name + " ALIVE: " + thread.IsAlive);
}
}
タイマーイベント:
private void T_Elapsed(object sender, ElapsedEventArgs e, Thread currentThread)
{
// EDIT: show the correct NAME! of the thread
Debug.WriteLine("Name: " + currentThread.Name);
System.Timers.Timer tim = sender as System.Timers.Timer;
currentThread.Abort(); // <-- this line throws exception
if (tim != null)
{
tim.Stop();
}
}
しかし、Abort
呼び出しは私に例外をスローします:
「コードが最適化されているか、ネイティブ フレームがコール スタックの一番上にあるため、式を評価できません」
そしてスレッドは生き続けます。の前にタイマーを開始しstartJob()
、スレッドを直接渡すと、正常に動作します。
public void startThread()
{
timer_timers.Elapsed += (sender, e) => T_Elapsed(sender, e, thread);
timer_timers.Interval = 5000;
timer_timers.Start();
thread.Start();
}
public void startJob()
{
// Start simulation process
while (true)
{
Thread.Sleep(700);
Debug.WriteLine("Thread: " + Thread.CurrentThread.Name + " ALIVE: " + thread.IsAlive);
}
}
Thread.CurrentThread
質問:バージョンが機能しないのはなぜですか? タイマースレッドも中止しなければならないからですか?ここで何が欠けていますか?
thisとthisのようなこの例外に対して見つけた回答は、異なるコンテキストからのものであり、正確な理由を理解するのに実際には役立ちません。
編集:これがスレッドを中止またはキャンセルする間違った方法であることはわかっています。実行することになっているジョブは、SerialPort を開くことです。しかし、〜200回ごとにスレッドが返されることはなく、結果を気にせずにスレッドを強制終了する必要があります。ループ中のシミュレーションは悪い例かもしれません。