私は、スレッドを保持しているいくつかのプロセスの実行を開始および停止するWindowsサービスを用意しています。スレッドが一旦停止した後にスレッドがさらに処理されないようにする
次のように私は2つのクラスを持っている:
public class PerformTask
{
Thread _thread = null;
public void StartTask()
{
_thread = new Thread(new ThreadStart(DoSomeWork));
_thread.Start();
}
public void DoSomeWork()
{
// Do Some Work
_thread = null;
}
public void Abort()
{
if (_thread != null)
{
try
{
_thread.Abort();
}
catch (ThreadAbortException) {}
}
}
}
public class Engine
{
List<PerformTask> _task = new List<PerformTask>();
public void Start()
{
var task = new PerformTask();
_task.Add(task);
// Add task to the timed action queue
_actionQueue.Add(s => task.StartTask(), TimeSpan.FromSeconds(10));
}
public void Stop()
{
_task.ForEach(task => task.Abort());
_task.Clear();
_actionQueue.Stop();
_actionQueue.Clear();
}
}
_actionQueueは、指定された定期的な時間間隔で指定されたアクションを実行するために開発されたカスタム定義されたソースコードです。すべてのアクションはキューに保持され、指定された時間間隔で呼び出されます。
WindowsサービスのOnStartメソッドとOnStopメソッドは、それぞれEngineクラスのStartメソッドとStopメソッドを呼び出します。
私が望むのは、Windowsサービスが停止しているとき、実行中のすべてのスレッドが処理/実行を停止する必要があることです。
しかし、ここで起こっているのは、新しいスレッドインスタンスが作成されているからです。私は、スレッドを保持しているいくつかのプロセスの実行を開始および停止するWindowsサービスを持っています。
次のように私は2つのクラスを持っている:
public class PerformTask
{
Thread _thread = null;
public void StartTask()
{
_thread = new Thread(new ThreadStart(DoSomeWork));
_thread.Start();
}
public void DoSomeWork()
{
// Do Some Work
_thread = null;
}
public void Abort()
{
if (_thread != null)
{
try
{
_thread.Abort();
}
catch (ThreadAbortException) {}
}
}
}
public class Engine
{
List<PerformTask> _task = new List<PerformTask>();
ActionQueue _actionQueue = new ActionQueue();
public void Start()
{
foreach(.....)
{
var task = new PerformTask();
_task.Add(task);
// Add task to the timed action queue
_actionQueue.Add(s => task.StartTask(), TimeSpan.FromSeconds(10));
}
_actionQueue.Start();
}
public void Stop()
{
_task.ForEach(task => task.Abort());
_task.Clear();
_actionQueue.Stop();
_actionQueue.Clear();
}
}
ActionQueueは、指定された定期的な時間間隔で指定されたアクションを実行するために開発されたカスタム定義されたソースコードです。すべてのアクションはキューに保持され、指定された時間間隔で呼び出されます。
WindowsサービスのOnStartメソッドとOnStopメソッドは、それぞれEngineクラスのStartメソッドとStopメソッドを呼び出します。
私が望むのは、Windowsサービスが停止しているとき、実行中のすべてのスレッドが処理/実行を停止する必要があることです。
しかし、新しいスレッドインスタンスはタスク開始の方法で作成されているとして何をここで起こっていることですが、私は_task.ForEach(タスク=> task.Abort()) を呼び出すときに、私はスレッドの正しいインスタンスを持っていません、それはすべて のインスタンスです_thread = new Thread(....); は、同じPerformTaskクラスに対して複数のキューが存在するため、アクセスされていません。
注:ActionQueueを変更することはできません。
スレッドを停止する正しい方法はありますか?
すべてのスレッド(ソースコードによって作成されたスレッドクラスのすべてのインスタンスを含む)を停止するにはどうすればよいですか?
私は質問する必要があります - あなたは明示的にスレッドを停止する必要がありますか?明示的に停止しないと、どうなりますか? –