구성에 따라 몇 가지 작업을 시작하는 Windows 서비스가 있습니다.스레드 시간 초과 또는 Thread.Sleep()이 오랫동안 스레드를 닫거나 중단합니까?
각 작업은 자체 스레드에서 시작하며 일부 작업은 하루에 한 번 실행됩니다.
나는 Thread.Sleep()
을 사용하고 다음 실행 시간을 계산합니다.
문제는 2 ~ 3 일 후에도 서비스가 계속 실행되고 있지만 일부 작업은 실행되지 않습니다.
잠 기간이 맞으면 모든 것이 잘 작동하고 예외가 발생하지 않습니다.
스레드를 중지 시키거나 수면 방법이 스레드를 중단시킬 수있는 것이 있습니까?
이 스레드
private void TaskLifeCycle()
{
try
{
// Create task object.
Type taskType = Type.GetType(this.ConfigurationElement.Task);
DebtLogic.Service.BackgroundTask bgTask = Activator.CreateInstance(taskType) as BackgroundTask;
bgTask.Context = this;
FireEvent(CreatedEventKey, new BackgroundTaskEventArgs(bgTask));
FireEvent(InitilizingEventKey, new BackgroundTaskEventArgs(bgTask));
bgTask.Initilize();
FireEvent(InitilizedEventKey, new BackgroundTaskEventArgs(bgTask));
// while the thread is alive, and did not abort then run.
while (this.CurrentThread.IsAlive)
{
try
{
//can run then block
if (CanRun(bgTask))
{
Run(bgTask);
}
}
catch (ThreadAbortException)
{
return;
}
catch (Exception ex)
{
FireEvent(ErrorEventKey,new BackgroundTaskErrorArgs(ex));
}
}
bgTask.Dispose();
}
catch (ThreadAbortException)
{
return;
}
catch (Exception ex)
{
FireEvent(ErrorEventKey, new BackgroundTaskErrorArgs(ex));
}
}
private bool CanRun(BackgroundTask bgTask)
{
if (this.ConfigurationElement.EventBasedTask)
{
return bgTask.CanRun();
}
TimeSpan time;
if (this.ConfigurationElement.Time != TimeSpan.Zero)
{
time = this.ConfigurationElement.Time - DateTime.Now.TimeOfDay;
if (time.TotalMilliseconds < 0)
time = time.Add(new TimeSpan(24, 0, 0));
}
else
{
time = new TimeSpan(0, 0, this.ConfigurationElement.Interval);
}
Thread.Sleep(time);
return bgTask.CanRun();
}
실행의 주요 기능과 초기화 방법은 내가 OS
는 긴 수면을 할 수 있는지 확실하지 않습니다 작업
스레드 시작과 예외 처리를 포함하여 스레드 워커의 기본 구현을 보여주는 코드를 공유하면 질문에 대한 답이 생길 수 있습니다. 지금 남은 유일한 일은 추측입니다. – rene
절전 모드를 사용하는 것과 같은 긴 '잠들'을 잘 다룰 수 없을 것 같습니다. 잠깐이라도 잠들지 않을 것입니다. – CodesInChaos