2013-06-12 4 views
0

그래서 약간의 문제가 있습니다. 그래서 같은 방법의 집합이 있습니다FileIO.AppendTextAsync 루프에서 사용할 때 임의의 예외가 throw 됨

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가 될 것이라고 상상했을 것이다 .. 글쎄, 스레드 안전하지만 분명히 아닙니다. 사실입니까?

또한 내 전화 코드를 수정하지 않고 어떻게 해결할 수 있습니까? 그래서,

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

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

을하지만 이것은 비동기 코드의 전체 목적을 격파 : 당신이 정말이 작업을 수행해야하는 경우

+4

죄송 합니다만, '비동기 작업'을 사용해야합니다. – SLaks

+0

Asynchrony는 스레딩과 아무 관련이 없습니다. 비동기 API는 거의 스레드로부터 안전하지 않습니다. – SLaks

답변

1

은, 당신의 유일한 선택은 비동기 방법 (Result 또는 사용)을 완료 할에 동 기적으로 Wait()입니다 당신은 정말로 이것을하지 말아야합니다. 또한 호출중인 코드가 제대로 작성되지 않으면 교착 상태가 발생합니다.

여기에서 비동기/대기를 사용할 수 없습니다. PCL에서 await - 이것은 휴대용 클래스 라이브러리

당신 사용 async입니다. 기본 플랫폼을 지원하는 플랫폼이있는 경우 Microsoft.Bcl.Async를 지원하는 플랫폼을 대상으로하고 필요에 따라 Microsoft.Bcl.Async를 참조하면됩니다.

+0

또한 교착 상태가됩니다. – SLaks

+0

@SLaks 내가 말했듯이, 호출 된 비동기 메소드가 어떻게 구현되는지에 따라 교착 상태에 빠질 수도 있습니다. (어디서나'ConfigureAwait (false)'를 사용하거나'async' -'wait'을 사용하여 구현되지 않았으므로 현재 컨텍스트를 캡처하지 않으면 교착 상태가 발생하지 않습니다.) – svick

관련 문제