FileIO.AppendTextAsync在循环中使用时抛出随机异常

时间:2013-06-12 14:17:22

标签: c# .net windows-runtime windows-store-apps async-await

所以我有一个特殊的问题。我有一套这样的方法:

StorageFile file;
public void WriteStuff() //This implements an interface, so can't be changed to async with a task returned
{
    Write();
}
async void Write()
{
  await FileIO.AppendTextAsync(file, DateTime.Now + " testing!"+Environment.NewLine);
}
async void Create()
{
  file=await ApplicationData.Current.LocalFolder.CreateFileAsync("test.txt", CreationCollisionOptions.OpenIfExists);
}

然后代码实际使用它如下:

var x=new Foo();
for(int i=0;i<1000;i++)
{
  x.WriteStuff(); //can't use async/await from here. This is in a portable class library
}

每当我拨打Test时,我都会收到非常随机的错误。像FileNotFound,AccessDenied,AccessViolation等等。

似乎只有在异步调用AppendTextAsync多次时才会发生。我会想象一个异步API会......好吧,线程安全,但显然不是。这是真的?

另外,如何在不修改调用代码的情况下修复此问题?

1 个答案:

答案 0 :(得分:1)

如果您确实需要这样做,那么您唯一的选择是同步Wait()以完成异步方法(或使用Result):

void Write()
{
    FileIO.AppendTextAsync(
        file, DateTime.Now + " testing!"+Environment.NewLine).Wait();
}

void Create()
{
    file = ApplicationData.Current.LocalFolder.CreateFileAsync(
        "test.txt", CreationCollisionOptions.OpenIfExists).Result;
}

但这会破坏异步代码的整个目的,所以你真的应该避免这样做。此外,如果您正在调用的代码编写不正确,执行此操作将导致死锁。

  

不能从这里使用async / await。这是一个便携式类库

可以使用来自PCL的async - await。您只需要定位支持它的平台,如果您的平台本身不支持,也可能引用Microsoft.Bcl.Async。