【发布时间】:2019-04-29 03:55:54
【问题描述】:
根据我在C#中所有async/await教程中的理解,我知道当我们定义一个async方法时,这意味着我们可以在其中添加await关键字,并以一个任务作为参数,使方法返回到如果任务太长,调用者。该方法可以在任务完成后恢复。
public void MyMainMethod()
{
DoSomethingAsync();
KeepOnDoingOtherStuff();
}
public async Task DoSomethingAsync()
{
//Do whatever
await LongOperation();
// Rest of the method that is executed when the long operation is
//finished.
}
所以在这里,当长操作正在进行时,当它等待时,DoSomething 异步将手交给 MainMethod 并执行 KeepOnDoingOtherStuff。好的
现在我的问题是我的 DoSomethingAsync 本身是否正在等待。在这种情况下:
public async void MyMainMethod()
{
await DoSomethingAsync();
//Here is a critical method that I want to execute only when
//DoSomethingAsync is finished
CriticalStuff();
}
public async Task DoSomethingAsync()
{
//Do whatever
await LongOperation();
// Rest of the method that is executed when the long operation is
//finished.
}
现在我等待我的 DoSomethingAsync 以确保它不会更进一步,但问题是 DoSomethingAsync () 在等待 LongOperation() 时仍会交给调用者,并且我的 Main 方法会恢复,这是我不想要的,因为它执行了我的关键任务。
在异步逻辑中有一些我很怀念的东西,那么“等待”一个包含异步方法的方法又有什么意义呢?
非常感谢我的问题的解决方案。
提前致谢。
【问题讨论】:
-
在第二个示例中,在
DoSomethingAsync()完全完成之前不应调用CriticalStuff()。您在此处发布的示例代码中一定缺少某些内容。 -
这是一篇关于异步编程的好文章,如果您有兴趣阅读有关此主题的更多信息。 rubikscode.net/2018/05/28/…
-
你的 MyMainMethod() 应该返回一个 Task 以及任何应该等待的调用
-
"问题是 DoSomethingAsync() 在等待 LongOperation() 时仍然给调用者,而我的 Main 方法恢复" 它不应该...其中的
await应该注意这一点,与LongOperation上的await相同。正如@Stijn 所说,如果发生这种情况,那么您的代码中一定还有其他事情在您没有显示。 -
只有在 DoSomethingAsync 完成后在您发布的代码中才会发生。不是吗?请为您的问题创建一个Minimal, Complete, and Verifiable example
标签: c# .net asynchronous