C# 使用wait时,读取文本文件和代码会跳转
我正在为Windows8.1平板电脑编写一个应用程序,我正在尝试从我保存的文本文件中读取数据(该文本文件刚刚超过1kb)。下面的代码在某些情况下有效,但主要失败(调试/单步执行代码通常会看到它成功)C# 使用wait时,读取文本文件和代码会跳转,c#,asynchronous,async-await,windows-8.1,C#,Asynchronous,Async Await,Windows 8.1,我正在为Windows8.1平板电脑编写一个应用程序,我正在尝试从我保存的文本文件中读取数据(该文本文件刚刚超过1kb)。下面的代码在某些情况下有效,但主要失败(调试/单步执行代码通常会看到它成功) StorageFolder folder=ApplicationData.Current.LocalFolder; 字符串fileName=“collections.json”; 公共字典主数据对象; 私有异步void CallLoad() { 等待此命令。加载(); } 公共异步任务加载() {
StorageFolder folder=ApplicationData.Current.LocalFolder;
字符串fileName=“collections.json”;
公共字典主数据对象;
私有异步void CallLoad()
{
等待此命令。加载();
}
公共异步任务加载()
{
//创建一个文件
var file=await folder.CreateFileAsync(文件名,CreationCollisionOption.OpenIfExists);
string fileContents=string.Empty;
如果(文件!=null)
{
//返回一个JSON字符串
fileContents=await FileIO.ReadTextAsync(file);//它为什么在这一行跳转?????
}
Dictionary customerFromJSON=JsonCrt.DeserializeObject(fileContents)??新建Dictionary();
masterDataObject=customerFromJSON;
返回masterDataObject;
}
在对代码进行多次单步执行后,我可以看到
fileContents=等待。。。。。
它将退出该方法,并继续执行Load()方法中未包含的其余代码
我已经回顾了async并等待,并且确实尝试去理解它,但是我的理解让我对为什么会发生这种情况感到困惑
我相信等待意味着执行将停止,直到您从正在调用的代码中得到响应为止(显然不是这样)
那么,我应该如何使用async使其正常工作,或者有比这段代码更好的替代方案吗
我已经寻找并尝试了许多选择,但没有成功,任何建议都会得到感激。等待在幕后做什么:
- 它创建一个回调,其中包含在wait之后的代码
- 它调用
函数,注册回调xyzAsync()
- 如果异步操作完成,则调用回调
CallLoad
方法是async void
,而不是async Task
,因此不能等待,这就是为什么您看到它在不等待内部异步IO完成的情况下继续
我相信等待意味着执行将停止,直到您从正在调用的代码得到响应
如果您一直等待异步操作,那么这仍然是完全正确的
那么,我应该如何使用async使其正常工作呢
async void
仅适用于顶级事件处理程序。如果CallLoad
未用作一个,则它应该是async Task
并等待:await CallLoad()代码>谢谢,一个小小的误会让我痛苦了三天。将void更改为Task解决了该问题
StorageFolder folder = ApplicationData.Current.LocalFolder;
string fileName = "collections.json";
public Dictionary<string, string> masterDataObject;
private async void CallLoad()
{
await this.Load();
}
public async Task<Dictionary<string, string>> Load()
{
//create a file
var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);
string fileContents = string.Empty;
if (file != null)
{
//returns a JSON string
fileContents = await FileIO.ReadTextAsync(file);//WHY DOES IT JUMP AT THIS LINE?????
}
Dictionary<string, string> customerFromJSON = JsonCrt.DeserializeObject<Dictionary<string, string>>(fileContents) ?? new Dictiy<string, string>();
masterDataObject = customerFromJSON;
return masterDataObject;
}