1

我正在尝试开发一个 Windows 8 Metro 风格的应用程序。我有以下用例:

async void dofileop()
{
  await writedatatofile();          
  printdata();
}

IAsyncAction writedatatofile()
{
  readdatafromfile();
  //play with data
  return FIleIO.WriteData();
}

async void readdatafromfile()
{
    await FileIO.readdata();
    operation1
    operation 2
}

在这里执行后await FileIO.readdata();,控件将立即转到 //play with data 而不是 operation1 和 operation2。执行后printdata()控制返回到 operation1 和 operation2。

我该如何解决这些问题?

4

1 回答 1

2

根据用例,readdatafromfile() 中的所有语句都应在控制返回到 writedatatofile() 之前执行。

这不是async方法的工作原理。您可能想阅读我的async/await介绍。当某个方法没有完成的操作(例如,)async时,它会返回给它的调用者。awaitFileIO.readdata

作为一般规则,让您的async方法 return Task,然后awaitTask其他async方法中的 s,如下所示:

async Task dofileop()
{
  await writedatatofile();          
  printdata();
}

async Task writedatatofile()
{
  await readdatafromfile();
  //play with data
  await FIleIO.WriteData();
}

async Task readdatafromfile()
{
  await FileIO.readdata();
  operation1
  operation 2
}

此外,我的限制是不要更改 IAsyncAction writedatatofile() 函数的语法。

这有点复杂:

async Task dofileop()
{
  await writedatatofileAsync();          
  printdata();
}

IAsyncAction writedatatofile()
{
  return writedatatofileAsync().AsAsyncAction();
}

async Task writedatatofileAsync()
{
  await readdatafromfile();
  //play with data
  await FIleIO.WriteData();
}

async Task readdatafromfile()
{
  await FileIO.readdata();
  operation1
  operation 2
}
于 2012-08-30T12:30:48.113 回答