嵌套Await操作在..NET 4.5中失败

时间:2012-08-30 04:58:49

标签: c# .net-4.5

我正在尝试开发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();后,控件立即//使用数据而不是operation1和operation2。执行printdata()后,控件将返回operation1和operation2。

如何解决这些问题?

1 个答案:

答案 0 :(得分:2)

  

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

这不是async方法的工作方式。您可能想要阅读我的async/await introasync方法在await某些未完成的操作(例如FileIO.readdata)时将返回其调用者。

作为一般规则,让您的async方法返回Task,然后await使用其他Task方法中的async,如下所示:< / p>

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
}