【发布时间】:2013-08-29 00:15:31
【问题描述】:
我有这样的方法:
public static async Task SaveAllAsync()
{
foreach (var kvp in configurationFileMap)
{
using (XmlWriter xmlWriter = XmlWriter.Create(kvp.Value, XML_WRITER_SETTINGS))
{
FieldInfo[] allPublicFields =
kvp.Key.GetFields(BindingFlags.Public | BindingFlags.Static);
await xmlWriter.WriteStartDocumentAsync();
foreach (FieldInfo fi in allPublicFields)
{
await xmlWriter.WriteStartElementAsync("some", "text", "here");
}
await xmlWriter.WriteEndDocumentAsync();
}
}
}
但是当有人打电话给SaveAllAsync() 时,我很难理解会发生什么。
我认为会发生的事情是这样的:
- 当有人第一次调用它时,
SaveAllAsync()将在await xmlWriter.WriteStartDocumentAsync();行将控制权返回给调用者 - 然后...当他们等待
SaveAllAsync()(或等待任务)...会发生什么?SaveAllAsync()是否仍会停留在第一次等待直到被调用?因为没有涉及线程,我想是这样的......
【问题讨论】:
-
您是否尝试过编写一个简单的程序来模拟这种行为并检查结果?
-
@Default 除非您已经知道它在做什么,否则实际上很难编写一个有效的模拟器来向您展示正在发生的事情。也就是说,有一百万本书/博客/文章/等。关于这个主题,这将使您对这里发生的事情有一个基本的了解。
-
@Servy 问题是关于一个有几个等待的方法。编写一个等待带有
Task.Delays 的方法并输出一些调试消息的程序并不是很复杂.. 除非我遗漏了什么。 -
@Default 不,这并不复杂,但是能够通过这些打印的消息 is 确定幕后真正发生的事情。从明显观察到的行为中并不能立即看出真正发生了什么,至少除非您对如何开始有一个基本的了解。
-
有人请检查我这个,但这个例子似乎不像是异步编码解决的问题?如果等待对异步方法的调用与简单的同步调用不同(就执行顺序而言)?即使异步线程正在完成工作,调用线程是否也不会阻塞?
标签: c# asynchronous async-await