Что такое асинхронная / ожидающая версия класса, которая запускает / останавливает «служебную» задачу? - PullRequest
0 голосов
/ 21 февраля 2020

В старых C# мы можем встретить такой код, который позволяет вам запускать / останавливать Задачу (реально поток), которая работает непрерывно, как фоновый рабочий поток ... возможно, обслуживающий очередь или что-то еще:

class ServiceTask
{
    private Task task;
    private CancellationTokenSource cancellation = new CancellationTokenSource();
    public void Start()
    {
        task = Task.Run(() => TaskLoop(),cancellation.Token);
    }

    public void Stop()
    {
        cancellation.Cancel();
        task.Wait();
    }

    private void TaskLoop()
    {
       while(!cancellation.Token.IsCancellationRequested)
       { ... }
    }

Извиняюсь за грубый пример, но мой вопрос таков, как будет выглядеть современный эквивалент async / await? Это так же просто, как await -ing в задаче вместо Wait -ing?

(Для пояснения: в моем примере это может выглядеть как реальная служба, но мой вопрос об этом шаблон кода конкретно ... полный реальный код слишком велик и сложен, чтобы публиковать все детали)

1 Ответ

2 голосов
/ 21 февраля 2020

Async / Await и Start / Stop могут выглядеть одинаково, но имеют разную семантику.

Задача с async / await предназначена для представления задачи, которая завершается самостоятельно. Основной рабочий процесс заключается в том, что он запускается при создании и завершается sh самостоятельно. Механизм отмены не является основным потоком.

Start / Stop имеет различную семантику в том смысле, что он никогда не закончится сам по себе. Он будет работать до тех пор, пока не будет вызван Stop. И хотя он может останавливаться сам по себе, основной поток заключается в том, что он будет выполняться неопределенно.

С учетом сказанного выше, я могу заключить, что семантика Task / async / await и start / stop имеет свое место в современной C# мир. Они оба имеют дело с разными режимами работы. Просто Задачи более заметны и более используются, потому что их варианты использования более распространены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...