2013-03-23 2 views
1

StreamReader를 사용하여 Windows 8 C# 파일에서 줄 단위로 간단한 텍스트 파일을 읽으려고합니다. 나는 많은 해결책을 시도했지만 그 중 일부는 효과가 없었다. 때때로 파일이 읽히고 가끔은 그렇지 않습니다 (클래스가 비어 있고 널 (null) 만 있습니다). 프로그램이 실행 중이면 절대로 작동하지 않지만 디버거를 설정하고 한 줄씩 이동하여 사용하기도합니다. 왜 그런가요? 함수가 이벤트 핸들러 (예를 들어, 버튼을 누를 때) 인 경우에만 async void를 사용한다StreamReader를 사용하여 파일을 한 줄씩 읽음

public async void read(string fileName) 
    { 

     string File = Path.Combine(Package.Current.InstalledLocation.Path, "myfolder", fileName); 

     StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(Path.GetDirectoryName(File)); 

     Stream s = await folder.OpenStreamForReadAsync(Path.GetFileName(File)); 
     StreamReader streamReader = new StreamReader(s); 

     myClass.name = streamReader.ReadLine(); 
     myClass.desc = streamReader.ReadLine(); 
     myClass.number = int.Parse(streamReader.ReadLine()); 
     myClass.house = new House[myClass.number]; 

     for (int i = 0; i < myClass.number; i++) 
     { 
      myClass.house[i] = new House(); 
      myClass.house[i].name = streamReader.ReadLine(); 
      myClass.house[i].size = double.Parse(streamReader.ReadLine()); 
     } 
    } 

답변

0

: 그 소스입니다. 일반적으로 async Task을 대신 사용해야합니다.

변경 void에서 Task로 메소드 서명 : 당신의 호출 코드에서 다음

public async Task read(string fileName) 

, await 그것은 :

await yourclass.read("c:\\my_filename.txt"); 
+0

나는 그것을 시도하지만이 메소드를 호출하고자하는 전체 페이지가 초기화되지만 페이지 생성자에서 "await read ("filetoRead.txt ")"를 쓰면 'await'연산자는 비동기 메서드 내에서만 사용할 수 있지만 생성자는 비동기가 될 수 없다는 것을 알 수 있습니다. 맞습니까, 아니면 놓친 것이 있습니까? – user2202439

+0

@ user2202439 - 비동기 생성자 관련 : http://stackoverflow.com/questions/14449349/winrt-async-data-load-in-constructor –

+0

도움을 주셔서 감사합니다. 나는 스티븐의 블로그를 여러 번 읽었지만 여전히 정확하게 쓸 수는 없다. 나는 비공개'비동기 작업 InitializeAsync()'를 가지고 있는데, 여기서는 오직 StreamReader로 데이터를 읽었고 이것과'public static async Task CreateAsync()'를 어디서 초기화했는지 기다리는 InitializeAsync를 호출한다. 나는 public static async Task UseMyClassAsync()에 의해이 메소드들을 호출한다. { instance = await MyClass.CreateAsync(); }} 그리고 여전히 문제가 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 어떻게 생겼는지 예를 들어 주시겠습니까? – user2202439

관련 문제