【发布时间】:2015-10-03 04:08:52
【问题描述】:
我们有一个通用的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 已完成
如果我们没有 async 用于覆盖 HeavyTask,那么它会按预期工作。但我不能保证那些覆盖Job 的人不会创建HeavyTask async。我想了解为什么它没有成功等待,有没有办法确保它会等待?如果可以的话,您能否解释一下将非异步函数重写为 async 是否是一种好习惯,如上所示?
【问题讨论】:
-
旧的异步无效问题。不要使用
protected abstract void HeavyTask();,使用protected abstract Task HeavyTask(); -
为什么你有单独的开始和等待方法?看起来你应该只有一个
StartJob方法,它返回一个Task并让每个子类决定如何创建任务。 -
@EhsanSajjad 这不是 OP 询问的方法。
-
您好@Lee,感谢您指出这一点。是的,你完全正确。这里不需要单独的
WaitJob函数。
标签: c# .net asynchronous async-await task-parallel-library