У меня есть служба Windows, разработанная на C #. В методе Start у меня есть инициализация, такая как:
Task _backgroundTask = null;
CancellationTokenSource _backgroundCancellationSource = null;
protected override void OnStart(string[] args)
{
......
_backgroundCancellationSource = new CancellationTokenSource();
CancellationToken token = backgroundCancellationSource.Token;
_backgroundTask = new Task(() => BackgroundFoldersProcessing(token), token, TaskCreationOptions.LongRunning);
.......
}
Теперь метод BackgroundFoldersProcessing выглядит следующим образом:
void BackgroundFoldersProcessing(CancellationToken token)
{
while (true)
{
try
{
if (token.IsCancellationRequested)
{
return;
}
DoSomeWork()
}
catch (Exception ex)
{
.........
}
}
}
Теперь метод Stop выглядит следующим образом:
protected override void OnStop()
{
.................
_backgroundCancellationSource.Cancel();
_backgroundTask.Wait();
_backgroundCancellationSource.Dispose();
_backgroundTask.Dispose();
_backgroundTask = null;
_backgroundCancellationSource = null;
.................
}
Теперь проблема заключается в том, что когда я пытаюсь остановить службу в середине обработки, метод Wait _backgroundTask не останавливает службу до тех пор, пока метод DoSomeWork () внутри BackgroundFoldersProcessing не будет завершен, служба Windows не остановит .
Есть ли какой-нибудь способ, хотя я могу остановить службу, и выполнение _backgroundTask будет прекращено, даже если метод DoSomeWork () будет завершен / выполнен или нет? Я также попытался token.ThrowIfCancellationRequested () в методе BackgroundFoldersProcessing, но это также не сработало. Я хочу, чтобы всякий раз, когда я пытаюсь остановить службу из диспетчера управления службами (SCM), служба должна быть немедленно остановлена, а __backgroundTask должен прекратить выполнение метода BackgroundFoldersProcessing и также завершиться. Как мне этого добиться?