gpt4 book ai didi

c# - 如何等待覆盖异步功能?

转载 作者:行者123 更新时间:2023-11-30 20:21:51 26 4
gpt4 key购买 nike

我们有一个通用的 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");

输出:

All Done
JobFoo is Done

如果我们没有用于覆盖 HeavyTaskasync,那么它会按预期工作。但我不能保证那些重写 Job 的人不会使 HeavyTask async。我想了解为什么没有成功等待它,有没有办法确保它会等待?如果可以的话,您能否也解释一下将非异步函数覆盖为异步函数是否是一种好习惯,如上所示?

最佳答案

没有等待,因为没有可等待的(即 Task)等待。该方法具有 void 返回类型。并且您应该避免在事件处理程序之外使用 async void

如果你想让派生类使用异步,让方法返回一个 Task 开始:

 protected abstract Task HeavyTaskAsync();

如果您随后需要同步覆盖,则同步返回一个 Task:

override Task HeavyTaskAsync()
{
// do stuff;
return Task.CompletedTask;
}

关于c# - 如何等待覆盖异步功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32914370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com