异步函数使代码无法工作

本文关键字:工作 代码 函数 异步 | 更新日期: 2023-09-27 18:14:02

首先,为标题向我道歉…我还没有找到适合我的单例:P

我首先需要下载一个INI文件来填充Dictionary。为此,我有这个类:

public class Properties : INotifyPropertyChanged
{
    private Dictionary<string, string> _properties;
    public Properties()
    {
        _properties = new Dictionary<string, string>();
    }
    public async void Load(string uri)
    { 
        Stream input = await connection(uri);
        StreamReader rStream = new StreamReader(input);
        string line;
        while((line = rStream.ReadLine()) != null)
        {
            if(line != "")
            {
                int pos = line.IndexOf('=');
                string key = line.Substring(0, pos);
                string value = line.Substring(pos + 1);
                _properties.Add(key, value);
                Debug.WriteLine("Key: " + key + ", Value: " + value);
            }
        }
        Debug.WriteLine("Properties dictionary filled with " + _properties.Count + " items.");
    }
    public async Task<Stream> connection(string uri)
    {
        var httpClient = new HttpClient();
        Stream result = Stream.Null;
        try
        {
            result = await httpClient.GetStreamAsync(uri);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            Debug.WriteLine(ex.HResult);
        }
        return result;
    }
    public string getValue(string key)
    {
        string result = "";
        try
        {
            result = _properties[key];
        }
        catch(Exception ex)
        {
            Debug.WriteLine(ex.Message);
            Debug.WriteLine(ex.HResult);
            result = "Not found";
        }
        return result;
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged([CallerMemberName]string propertyName = "")
    {
        var Handler = PropertyChanged;
        if (Handler != null)
            Handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

}

Dictionary主要包含一个Key和一个URL,用于将XML文件下载到应用程序的各个页面。

要填充的MainPage的代码是:

    public MainPage()
    {
        this.InitializeComponent();
        //Properties dictionary filling
        prop = new Properties();
        prop.Load("URL");
        tab = new Bars.TopAppBar();
        bab = new Bars.BottomAppBar();
        tABar = this.topAppBar;
        actvt = this.Activity;
        bABar = this.bottomAppBar;
        //Constructor of the UserControl
        act = new Home(this, prop);
    }

UserControl的构造函数使用MainPage作为CallbackProperties类来查找下载XML文件的URL。

所发生的是,由于Properties.Load()是一个异步方法,被调用,然后执行其余的行,当程序完成时,然后返回Load()并填充Dictionary。由于Home构造函数依赖于PropertiesValue,因此得到Exception

我尝试创建async void s分配不同的优先级,以迫使程序先运行一件事,然后剩下的,但它也没有工作。

所以,总结一下,我需要确保Properties首先填充,有人知道怎么做吗?

提前感谢!

异步函数使代码无法工作

Eva如果您想等待Load方法完成,则必须更改此方法以返回一个Task。

public async Task LoadAsync(string uri)...
如果你把你的代码放在页面的loaddeventhandler中,并使这个方法异步,那就更好了。之后,您将能够等待Properties。加载方法。

如果你想在构造函数中调用这个方法,你可以这样做:

Task.Run(async () =>{
var task = p.LoadAsync().ConfigureAwait(false);
await task;
}).Wait()

但是你必须意识到,死锁可能出现,如果在LoadAsync方法将等待没有禁用上下文切换(ConfigureAwait)。