调用async方法不设置成员变量

本文关键字:成员 变量 设置 async 方法 调用 | 更新日期: 2023-09-27 18:15:51

这段代码是在visual studio 2012中用c#编写的,我使用的是winrt工具包

嗨,我试着创建这个loadGrupos来捕获文件groupo .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不能加载文件,有时win8加载有时没有。现在,修改后的应用程序块和做到前面。

如果我用调试的可视化找到文件,如果我只运行没有

调用async方法不设置成员变量

应该有关于"未等待调用async方法"(或类似的东西)的警告。

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

。廉价和肮脏(不是WinRT的好主意)的方法是调用Task。等待leituraDeUmArquivo的结果(需要更新方法返回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.