我们有一个通用的
Job
类,其中包含一个抽象的HeavyTask
方法,如下所示:abstract class Job {
private Task m_task;
protected abstract void HeavyTask();
public void StartJob(){
m_task = Task.Run(() => HeavyTask());
}
public async Task WaitJob(){
await m_task;
}
}
而派生类则重写 HeavyTask
函数并将其变成异步的:
class JobFoo : Job {
protected override async void HeavyTask()
{
await Task.Delay(1000);
Debug.WriteLine("JobFoo is done");
}
}
当我们使用这种方法时,似乎没有等待 HeavyTask()
的完成:
Job job = new JobFoo();
job.StartJob();
await job.WaitJob();
Debug.WriteLine("All Done");
输出:
全部完成
JobFoo 已完成
如果我们不对重写的 HeavyTask
使用 async
,那么它会按预期工作。但是我不能保证覆盖 Job
的人不会将 HeavyTask
设为 async
。 我想知道为什么它没有成功等待,是否有方法确保它被等待? 如果可以的话,您能否解释一下像上面展示的将非异步函数重写为异步函数是否是一个好习惯呢?
protected abstract void HeavyTask();
,请使用protected abstract Task HeavyTask();
。 - xZ6a33YaYEfmvStartJob
的方法,它返回一个Task
,并让每个子类决定如何创建任务。 - Lee