Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用wait时,读取文本文件和代码会跳转_C#_Asynchronous_Async Await_Windows 8.1 - Fatal编程技术网

C# 使用wait时,读取文本文件和代码会跳转

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() { 等待此命令。加载(); } 公共异步任务加载() {

我正在为Windows8.1平板电脑编写一个应用程序,我正在尝试从我保存的文本文件中读取数据(该文本文件刚刚超过1kb)。下面的代码在某些情况下有效,但主要失败(调试/单步执行代码通常会看到它成功)

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()
    函数,注册回调
  • 如果异步操作完成,则调用回调
因此,如果您使用调试器单步执行代码,它将执行一些其他代码,如果它点击await,在await完成异步操作后立即返回代码

它将退出该方法,并继续执行Load()方法中未包含的其余代码

这正是它要做的,在异步操作完成之前,将控制权让给调用站点

我假设您的问题在于您的
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;
}