스레드 보유와 함께 수행되는 일부 프로세스의 실행을 시작하고 중지하는 Windows 서비스가 있습니다.스레드가 더 이상 처리하지 못하도록 중지가 완료되면
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 서비스가 있습니다.
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 호출 할 때
는하지만, 여기에서 일어나고있는 것은, 새로운 스레드 인스턴스가 StartTask 방법에서 생성되는 것입니다 (작업 => task.Abort는()) 나는 스레드의 올바른 인스턴스가 없습니다 , 그것은 모두 의 인스턴스입니다. _thread = new Thread (....); 은 동일한 PerformTask 클래스에 대해 여러 큐가 있으므로 액세스되지 않습니다.
참고 : ActionQueue를 변경할 수 없습니다.
올바른 방법으로 스레드를 중지 할 수 있습니까?
모든 스레드 (소스 코드로 작성된 스레드 클래스의 모든 인스턴스 포함)를 중지하려면 어떻게합니까?
내가 물어야한다 - 명시 적으로 스레드를 중지해야합니까? 명시 적으로 중지하지 않으면 어떻게됩니까? –