Tôi hoàn toàn mới với C# 5 mới async
/await
từ khóa và tôi quan tâm đến cách tốt nhất để triển khai sự kiện tiến trình.C# async/await Progress event trên Task <> object
Bây giờ tôi sẽ thích nếu sự kiện Progress
ở trên chính bản thân số Task<>
. Tôi biết tôi chỉ có thể đặt các sự kiện trong lớp có chứa các phương pháp không đồng bộ và vượt qua một số loại đối tượng nhà nước trong xử lý sự kiện, nhưng với tôi mà dường như nhiều hơn một workaround hơn một giải pháp. Tôi cũng có thể muốn các nhiệm vụ khác nhau để kích hoạt các trình xử lý sự kiện trong các đối tượng khác nhau, điều này nghe có vẻ lộn xộn theo cách này.
Có cách nào tôi có thể làm điều gì đó tương tự như sau ?:
var task = scanner.PerformScanAsync();
task.ProgressUpdate += scanner_ProgressUpdate;
return await task;
Đối với WinRT, sẽ dễ dàng hơn khi viết phương thức 'async' bình thường với' IProgress '(theo các quy ước C#) và sau đó sử dụng 'AsyncInfo.Run' để bọc nó vào' IAsyncOperationWithProgress'/'IAsyncActionWithProgress' hơn là triển khai trực tiếp các giao diện đó. –
@StephenCleary: Vâng, nó phụ thuộc vào việc bạn đang suy nghĩ về * người gọi * hay * triển khai *. Nếu bạn đang cố gắng trưng ra các chức năng để người khác gọi vào, tôi đã nghĩ các kiểu "bản địa" của WinRT sẽ thích hợp hơn. Rõ ràng là có nhiều bộ chuyển đổi khác nhau giữa hai loại. –
Việc theo các quy ước C# trong C# dễ dàng hơn và sử dụng các trình bao bọc ('AsTask' /' AsyncInfo') tại các ranh giới. Vì vậy, một thành phần WinRT được thực hiện trong C# sẽ trả về kiểu giao diện WinRT, nhưng sẽ thực hiện nó bằng cách sử dụng thường xuyên 'async' được bao bọc trong 'AsyncInfo'. –