次のコードには、メインスレッドがウェイトハンドルをリセットした後、ワーカースレッドがすぐに終了したり、最終アクションを実行したりしないという欠点があります。代わりに、ループの次の反復に到達するまで実行を継続し、その時点で無期限にブロックされます。
static void Main()
{
ManualResetEvent m = new ManualResetEvent(true); // or bool b = true
Thread thread = new Thread(new ThreadStart(delegate()
{
while(m.WaitOne()) //or while(b)
{
//do something
}
//perform final operation and exit
}));
thread.Start();
//do something
m.Reset(); //or b = false
//do something else
}
次のコードには、Abort()メソッドを使用するという欠点がありますが(絶対に避けるべきだと言う人がいます)、私が探していることを正確に実行します。メインスレッドがそうするように指示したらすぐに、最後の操作を実行して終了します。
static void Main()
{
Thread thread = new Thread(new ThreadStart(delegate()
{
try
{
while(true)
{
//do something
}
}
catch(ThreadAbortException e)
{
//perform final operation and exit
}
}));
thread.Start();
//do something
thread.Abort();
//do something else
}
どちらのソリューションも理想的ではないので、私が探している機能を実装するための適切な方法は何ですか?
(.net 4.5のタスクを含まないソリューションが望ましいです)