18

Tôi đang cố gắng để lặp tất cả các file trong một thư mục sử dụng GetFilesAsync, nhưng mỗi khi tôi gọi phương thức getResults, nó ném một ngoại lệ mà nóiMột phương pháp được gọi vào một thời điểm bất ngờ

System.InvalidOperationException: một phương pháp được gọi là tại một thời gian bất ngờ

mã này chỉ đơn giản là

var files = myStorageFolder.GetFilesAsync(); //runs fine 
var results = files.GetResults(); //throws the exception 

tôi mới để Win 8 dev nên tôi có thể thiếu một cái gì đó hiển nhiên.

Chỉnh sửa (giải quyết) Tôi đang chạy các ứng dụng giao diện điều khiển của tôi, nhưng bây giờ mà các chương trình chạy async, phương pháp files.GetResult() không hiện hữu.

static void Main(string[] args) 
{ 
    var files = GetFiles(myStorageFolder); 
    var results = files.GetAwaiter().GetResults();//Need to add GetAwaiter() 
} 

static async Task GetFiles(StorageFolder sf) 
{ 
    await sf.GetFilesAsync(); 
} 

Trả lời

10

Bạn cần đợi phương thức async hoàn tất. Vì vậy, bạn có thể sử dụng tính năng chờ mới như một tùy chọn:

var files = await myStorageFolder.GetFilesAsync(); 

Bạn có thể muốn kiểm tra tài liệu về cách xử lý các phương pháp không đồng bộ here.

1

bạn nên await các var files = myStorageFolder.GetFilesAsync(); như các hoạt động vẫn có thể chạy khi bạn nhận được để hướng dẫn tiếp theo var results = files.GetResults(); //throws the exception

var files = await myStorageFolder.GetFilesAsync(); //runs fine 
var results = files.GetResults(); //this will run when call above returns 
29

Nếu bạn không muốn sử dụng các từ khóa async (trong trường hợp của tôi, mã ở bên trong một tài sản, vì vậy async không phải là một lựa chọn), bạn có thể sử dụng một TaskAwaiter thay vào đó, bằng cách kết nối hai phương pháp:

var folder = Package.Current.InstalledLocation.GetFolderAsync("folderName").GetAwaiter().GetResult(); 

này sẽ không ném một InvalidOperationException cũng không gây ra bế tắc.

+0

Tôi có cần bất kỳ câu lệnh 'Sử dụng' nào để sử dụng phương thức' GetAwaiter' không? – user1

+1

@ user1 Tôi không thể nhớ, đây là từ 2 năm trước. Nhưng nhìn qua các tài liệu, đây là phương pháp mở rộng bạn cần: ['WindowsRuntimeSystemExtensions.GetAwaiter'] (https://msdn.microsoft.com/en-us/library/hh582011 (v = vs.110) .aspx). Nó được định nghĩa trong không gian tên 'System', vì vậy bạn có thể có nó trong phạm vi đã là – dcastro

+3

Tôi nhận thấy' GetAwaiter() 'là trên' Task' và tôi đang cố gắng sử dụng nó trên một 'IAwaitableOperation' vì vậy tôi phải gọi' AsTask' rồi đến 'Kết quả', chết tiệt' UWP'. Cảm ơn mặc dù! – user1