【问题标题】:Calling async method does not set member variable调用异步方法不设置成员变量
【发布时间】:2013-06-04 02:01:27
【问题描述】:

这段代码是在 Visual Studio 2012 中用 C# 编写的,我使用的是 winrt 工具包

您好,我尝试创建这个 loadGrupos 来捕获文件 grupo.txt 并读取他的内容并将其加载到 Grupos 类中,但我不知道发生了什么列表 grupos 从 json 接收内容但是当我调用结束时loadGrupos 变量 grupos 不公开任何内容。 我真的不知道发生了什么事。我试了调试,没有发现任何错误。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    using Windows.Storage;
    using Windows.ApplicationModel;
    using WinRTXamlToolkit.IO.Extensions;
    using Windows.UI.Popups;
    namespace xxx;
    public class MyJConverter
    {

    public String _Path;
    //private Windows.ApplicationModel.Package package;
    //   private Windows.Storage.StorageFolder installedLocation;
    private StorageFolder _Folder = Windows.Storage.ApplicationData.Current.LocalFolder;
    //KnownFolders.DocumentsLibrary
    public MyJConverter() {
    //  package = Windows.ApplicationModel.Package.Current;
    //   installedLocation = package.InstalledLocation;
    }

    public void save(Object obj)
    {
    _Path = JsonConvert.SerializeObject(obj);

    gravandoUmDocumento("data",_Path);

    }
    public void saveGrupo(Object obj)
    {

    _Path = JsonConvert.SerializeObject(obj);

    gravandoUmDocumento("grupo", _Path);

    }



    public async void gravandoUmDocumento(String nomeDoArquivo,String menssagem) {




    //  var _Folder = Windows.Storage.ApplicationData.Current.LocalFolder;
    // var _Folder  = Windows.ApplicationModel.Package.Current.InstalledLocation;
    //await menssagem.WriteToFile(nomeDoArquivo + "1.txt", KnownFolders.DocumentsLibrary);
    await menssagem.WriteToFile(nomeDoArquivo + ".txt", _Folder);
    }
        private List<Ano> anos;

 public List<Ano> load()
 {
        leituraDeUmArquivo("data").Wait();
 if (anos != null)
 {        
    return anos;

 }
 return null;
     }


private List<Grupos> grupos;

public List<Grupos> Grupos
    {
    get { return grupos; }
    set { grupos = value; }
    }

    public List<Grupos> loadGrupos()
    {
       leituraDeUmArquivo("grupo").Wait();

        {
            if (grupos != null)
            {

                return grupos;   
            }
            else
                return null;
        }


    }
    public async Task leituraDeUmArquivo(String arquivoASerLido)
    {
    String leitura = "";
    //leitura do data
    try
    {
    // settings

    var _Path =arquivoASerLido + ".txt";
    // acquire file
    var _File = await _Folder.GetFileAsync(_Path);


    // read content
    leitura = (String) await Windows.Storage.FileIO.ReadTextAsync(_File);
    //    leitura = (String)_ReadThis;
    }
    catch {
    //     leituraDeUmArquivo(arquivoASerLido);
    }

    if (leitura != "")
    {
            if (arquivoASerLido.Equals("data"))
            {
                    try
            {
                    anos = JsonConvert.DeserializeObject<List<Ano>>(leitura);
            }
            catch { 

            }
            }
            if (arquivoASerLido.Equals("grupo"))
            {
                    try{
                    grupos = JsonConvert.DeserializeObject<List<Grupos>>(leitura);
                }
                    catch { }

            }

        }


    }

}

您好,我做了您推荐的修改,但问题没有解决,所以我发布了所有代码。 我真的没有找到为什么winrt无法加载文件,有时win 8加载有时没有。 现在通过修改应用程序块并转到前面。

如果我去调试视觉发现文件,如果我去只运行no。

【问题讨论】:

  • 我已更改标题/删除了代码中的空格。随时恢复/更新。

标签: c# xaml windows-runtime


【解决方案1】:

应该有关于“调用异步方法而不等待”(或类似的东西)的警告。

您需要await 来完成async 方法,而不仅仅是调用它。

即廉价而肮脏(对 WinRT 来说不是好主意)方法是在 leituraDeUmArquivo 的结果上调用 Task.Wait(该方法需要更新以返回 Task):

leituraDeUmArquivo("grupo").Wait();

更好的方法是使代码正确异步,只需 await 调用 leituraDeUmArquivo(您的 loadGrupos 函数可能也需要标记为 async 并进行适当处理)。

注意:使await/.Wait()工作leituraDeUmArquivo应该返回Task

public async Task leituraDeUmArquivo(String arquivoASerLido)
// don't need to touch body of the method.

【讨论】:

  • 对,你只是调用了一个异步,没有等待它,所以你不知道它什么时候执行。
  • 您对解决方案的描述是正确的,但是您的示例调用Wait 而不是使用await,这是错误的。
  • @Gustavo:一个好的原则是“避免使用async void”(即改用async Task)。原因之一是您可以 await 调用该方法。
  • @StephenCleary,你是绝对正确的 - leituraDeUmArquivo 不返回 Task(而是返回 void)所以它不能是 .Wait'ed/await'ed。 Wait() 是等待 async 操作完成的廉价而肮脏的方式,对于 WinRT 应用程序来说绝对是错误的选择。
猜你喜欢
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
相关资源
最近更新 更多