【发布时间】:2020-10-25 04:40:04
【问题描述】:
在我的 WPF 应用程序中,我使用按钮单击来创建 XML 文件。并在异步任务成功完成时获得反馈并显示一个消息框。
Window.cs
public partial class BindXml : Window
{
public BindXml()
{
InitializeComponent();
}
private void Create_File_OnClick(object sender, RoutedEventArgs e)
{
XmlCreator xmlCreator = new XmlCreator();
Task task = xmlCreator.CreateXmlAysnc();
MessageBox.Show(task.IsCompletedSuccessfully
? "XML Created Successfully."
: "Wrong");
}
XmlCreator.cs
public async Task CreateXmlAysnc()
{
string filePath =
"E:\\OneDrive\\Programming\\C#\\03_Csharp\\02_WPF\\06_DataBinding\\03_Binding\\09_BindXml\\data.xml";
// Create a xml tree.
XDocument xmlDocument = new XDocument(
new XElement("StudentList",
new XElement("Student",
new XAttribute("Id", "1"),
new XElement("Name", "Tim")),
new XElement("Student",
new XAttribute("Id", "2"),
new XElement("Name", "Gary")),
new XElement("Student",
new XAttribute("Id", "3"),
new XElement("Name", "Tom")))
);
try
{
await using FileStream fileStream = File.Open(filePath, FileMode.Create);
await xmlDocument.SaveAsync(fileStream, SaveOptions.None, CancellationToken.None);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
throw;
}
}
点击按钮后,文件创建成功。但是,消息框显示“错误”。任务未成功完成。然后我使用了下面的代码。消息框将显示为 true。
Task task = xmlDocument.SaveAsync(fileStream, SaveOptions.None, CancellationToken.None);
await Task.WhenAll(task);
// Messagebox would show true
MessageBox.Show(task.IsCompletedSuccessfully.ToString());
如果我将Task.Wait() 添加到 Window.cs 中,应用程序将阻塞。看起来任务从未完成,但文件已经创建。
这里面的原因是什么?
【问题讨论】: