亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用抽象類的任務啟動/停止處理

使用抽象類的任務啟動/停止處理

C#
繁星點點滴滴 2022-06-12 15:20:37
我有這個代碼邏輯來處理我的任務: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 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

您可以重寫您的抽象類以具有可以知道您的工作何時完成的內部啟動方法。假設您的工作是同步的并且不帶參數:


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);

    }

}


查看完整回答
反對 回復 2022-06-12
?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

使運行集受保護而不是私有。這樣它就不能從外部訪問,但它可以被繼承自 BotTask 的實體訪問



查看完整回答
反對 回復 2022-06-12
  • 2 回答
  • 0 關注
  • 143 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號