【问题标题】:Understanding how to Get Task feedback from XDocument.SaveAsync method了解如何从 XDocument.SaveAsync 方法获取任务反馈
【发布时间】: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 中,应用程序将阻塞。看起来任务从未完成,但文件已经创建。

这里面的原因是什么?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    使用 async 和 await 模式,惯用方法是 await 任务catch 异常

    因为您来自 事件处理程序,所以可以使用 async void 来利用 async 和 await 模式,而不必担心原始 task,或者更糟糕的是尝试使用Wait 或任何其他阻塞方法。

    此外,当在 async 方法中产生 异常 时,它会被放置在 task 上,并将被抛出 await,进而启用您可以流畅地处理它,同时还允许 continuation 在原始 context 上运行。

    示例

    private async void Create_File_OnClick(object sender, RoutedEventArgs e)
    {       
       try
       {
          XmlCreator xmlCreator = new XmlCreator();
          await xmlCreator.CreateXmlAysnc();
       }
       catch (Exception e)
       {
          MessageBox.Show(e.Message); 
       }
    }
    
    public async Task CreateXmlAysnc()
    {
    
       ...
    
       await using FileStream fileStream = File.Open(filePath, FileMode.Create);
       await xmlDocument.SaveAsync(fileStream, SaveOptions.None, CancellationToken.None);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      相关资源
      最近更新 更多