异步函数使代码无法工作
本文关键字:工作 代码 函数 异步 | 更新日期: 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
作为Callback
和Properties
类来查找下载XML
文件的URL。
所发生的是,由于Properties.Load()
是一个异步方法,被调用,然后执行其余的行,当程序完成时,然后返回Load()
并填充Dictionary
。由于Home
构造函数依赖于Properties
的Value
,因此得到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)。