如何等待覆盖异步函数?

时间:2015-10-02 19:21:01

标签: c# .net asynchronous async-await task-parallel-library

我们有一个通用的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是一个好习惯,如上所示?

2 个答案:

答案 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();