【发布时间】:2018-12-12 20:59:23
【问题描述】:
我有这个代码逻辑来处理我的任务:
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;
}
}
如您所见,我无法在 myJob 完成后立即访问 Running 将其设置为 false,我希望 BaseJob 处理该问题。
为了自动检测myJob 何时完成,我必须对基类进行哪些代码逻辑更改,然后使用Running = false 完成任务,而无需从继承的类中访问最少?
【问题讨论】:
-
那么为什么要编写自己的任务对象而不是使用
System.Threading.Tasks.Task?您甚至将 TPL 标记为相关,但您……没有使用它。 -
@Servy 我有一个基本上是机器人的程序,它运行大量不同的任务。这就是为什么,我需要一个比 TPL 任务更复杂的结构。哦,顺便说一句,当我在自定义任务中运行“作业”时,我也使用 TPL 任务。
-
然而你的“任务”实际上并没有做任何 TPL 任务没有做的事情。您的问题最好通过一种方法来完成工作并返回常规 TPL
Task。如果有什么你需要做但没有涵盖的,你肯定没有展示出来。 -
@Servy 显示的代码太多了。我让它尽可能简单,但我保证它比 TPL 任务做的更多。
-
@garryman 仍然没有看到任何理由不只是有一个返回
Task的方法。 TPL 任务有一个错误,它可以有一个取消令牌,它有一个状态。您可以编写一个方法来检查取消令牌并在未取消时运行异步操作,并且此类方法可以返回Task为此类异步方法的调用者提供与您的Task版本一样多的信息. (具有 TPL 任务具有更多功能的优点,并且可以与 .NET 和 C# 中的各种任务感知功能一起使用。)
标签: c# oop inheritance task abstract-class