Как отменить задачу или немедленно прекратить ее выполнение? - PullRequest
1 голос
/ 12 марта 2012

У меня есть служба 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 Ответ

0 голосов
/ 12 марта 2012

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

, определяя поток:

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

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

catch (ThreadAbortException e)
{
     return;
}

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

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

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

...