2012-09-26 5 views
1

PictureFolder에서 파일 목록을 가져 오는 메소드를 만들고 싶습니다.Windows 8의 KnowFolders에서 파일을 검색하는 방법은 무엇입니까?

public Task<List<string>> GetImages() 
{ 
var task = new Task<List<string>>(() => 
{ 
var files = new List<string>(5); 
StorageFolder picturesFolder = KnownFolders.PicturesLibrary; 
IReadOnlyList<IStorageItem> itemsList = picturesFolder.GetItemsAsync().GetResults(); 
foreach(var item in itemsList) 
{ 
if(item is StorageFile) 
{ 
files.Add(item.Name); 
} 
} 
return files; 

}); 
return task; 
} 

이 메소드 테스트에 대한 내 코드 : :이 라인이 예외

System.InvalidOperationException was unhandled by user code 
    HResult=-2147483634 
    Message=A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E) 
    Source=Windows.Foundation 
    StackTrace: 
     at Windows.Foundation.IAsyncOperation`1.GetResults() 
     at Praktyka.Models.PictureManager.<GetImages>b__0() in d:\Documents\Visual Studio 2012\Projects\Praktyka\Praktyka\Models\PictureManager.cs:line 63 
     at System.Threading.Tasks.Task`1.InnerInvoke() 
     at System.Threading.Tasks.Task.Execute() 
    InnerException: 

(방법 GetImages)

IReadOnlyList<IStorageItem> itemsList = picturesFolder.GetItemsAsync().GetResults(); 
을 얻을

var pic = new PictureManager(); 
pic.GetImages().RunSynchronously(); 
List<string> images = pic.GetImages().Result; 
bool hasValue = images.Count > 0; 
Debug.WriteLine(string.Format("Has value {0}", hasValue)); 

을 나는이 방법을 만들

이 문제를 해결하려면?

답변

5

RunSynchronously 메서드는 현재 스레드에서 작업을 시작합니다. 그러나 GetItemsAsync에서 반환 된 작업이 이미 시작되어 있으므로 예외가 발생합니다.

당신은 비동기을 활용하도록 코드를 리팩토링 할 필요가

은/키워드를 기다리고 :

마찬가지로
public async Task<List<string>> GetImages() 
{ 
var files = new List<string>(); 
StorageFolder picturesFolder = KnownFolders.PicturesLibrary; 
IReadOnlyList<IStorageItem> itemsList = await picturesFolder.GetItemsAsync(); 
foreach(var item in itemsList) 
{ 
    if(item is StorageFile) 
    { 
    files.Add(item.Name); 
    } 
} 
return files; 
} 

await를 이용해야한다 GetImages를 호출하는 방법

var pic = new PictureManager(); 
List<string> images = await pic.GetImages();; 
bool hasValue = images.Count > 0; 
Debug.WriteLine(string.Format("Has value {0}", hasValue)); 
+1

+1 기다리는 것이 좋습니다. –

+0

고마워요! 지금은 이해. – BILL

0

난 당신이 전화를한다고 생각 Completed 처리기에서 GetResults를 가져오고 GetItemsAsync() 결과에는 즉시 반환하지 않습니다.

관련 문제