Обработка запуска / остановки задачи с использованием абстрактных классов - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть эта кодовая логика для решения моих задач:

public abstract class BaseJob{

    public bool Running { get; private set; }

    public CancellationToken Token => _tokenSource.Token;

    private CancellationTokenSource _tokenSource;

    public virtual void Start()
    {
        _tokenSource = new CancellationTokenSource();
        Running = true; 
    }
}

Теперь, когда я наследую BaseJob, у меня будет такая ситуация:

public class CustomJob: BaseJob{

public MyEnum Status {get; private set;}

public StopRequested { get; set;}

public override async void Start(){

    base.Start();
    while(!StopRequested){
        await MyLongRunningMethod();
    }

    //base.Running = true but I can't access it here!
}

public async Task<bool> MyLongRunningMethod(){  
            await Task.Run(()=>{
                //more work
            },this.Token);
            //someWork

    return false;
}
}

Как вы можете видеть, я могуНет доступа к Running, чтобы установить его в значение false, как только myJob завершится, и я хочу, чтобы BaseJob справился с этим.

Какие изменения логики кода я должен внести в базовый класс, чтобы автоматическиопределить, когда заканчивается myJob, а затем завершить задачу с помощью Running = false, не обращаясь к наименьшему количеству из унаследованных классов?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы можете переписать свой абстрактный класс, чтобы иметь внутренний метод запуска, который может знать, когда ваша работа завершится.Предполагая, что ваша работа синхронна и не имеет параметров:

public abstract class BotTask
{

    private bool Running { get; set; }

    public CancellationToken Token => _tokenSource.Token;

    private CancellationTokenSource _tokenSource;

    public abstract void Start();

    protected void InternalStart(Action job)
    {
        _tokenSource = new CancellationTokenSource();
        Running = true;
        job();
        Running = false;
    }
}

public class CustomTask : BotTask
{
    public override void Start()
    {
        InternalStart(MyJob);
    }
}
0 голосов
/ 13 декабря 2018

Сделать набор для бега защищенным, а не личным.Таким образом, к нему нельзя получить доступ извне, но к нему могут обращаться сущности, которые наследуются от BotTask

...