我们有一个通用的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是一个好习惯,如上所示?
答案 0 :(得分:9)
没有等待,因为没有等待(即[\w\s]{3,} --> alphanumeric and spaces with 3 or more
)等待。该方法具有Task
返回类型。并且您应该避免在事件处理程序之外使用void
。
如果要启用派生类以使用async,则方法将返回async void
以开头:
Task
如果您需要同步覆盖,则同步返回 protected abstract Task HeavyTaskAsync();
:
Task
答案 1 :(得分:-3)
我不认为这条线是可以接受的:
m_task = Task.Run(() => HeavyTask());
等待的配偶是什么?没有返回任何值。
怎么样
Task.Run(() => HeavyTask()).Wait();