Как отменить задачу или немедленно прекратить ее выполнение?

У меня есть служба 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 и также завершиться. Как мне этого добиться?

1 ответ

Решение

Вы можете попробовать использовать ThreadAbortException:

определение потока:

ThreadStart threadDelegate = new ThreadStart(BackgroundFoldersProcessing);
Thread thread_ = new Thread(threadDelegate);
thread_.Start();

Добавить улов в BackgroundFoldersProcessing

catch (ThreadAbortException e)
{
     return;
}

и когда вы хотите выключить его, используйте:

thread_.Abort();
thread_.Join();

Затем, когда Abort() будет вызван, будет выброшено ThreadAbortException.

Другие вопросы по тегам