我有這個代碼邏輯來處理我的任務: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);
}
}
- 2 回答
- 0 關注
- 143 瀏覽
添加回答
舉報
0/150
提交
取消