6

Tôi đang phát triển một ứng dụng metro và tôi muốn tạo một số hoạt động không đồng bộ mà các lớp của riêng tôi sẽ triển khai.Tôi có thể tạo các hoạt động không đồng bộ của riêng mình bằng WinRT bằng giao diện IAsyncOperation như thế nào?

Tôi đã tìm thấy các ví dụ về async sử dụng các hoạt động WinRT (ví dụ: CreateFileAsync). Tôi không tìm thấy bất kỳ ý định mà một người nào đó đang tạo ra một phương pháp async và tiêu thụ nó.

+0

Tại sao don' t bạn chỉ cần thực hiện các phương pháp theo tài liệu (khá khan hiếm)? – svick

+0

Rõ ràng, bạn không có kiến ​​thức chuyên sâu về những gì có liên quan. Đây là những gì tài liệu gợi ý. Cho nên cảm ơn bạn. –

+2

Tôi không hiểu. Tài liệu đề nghị hỏi tại SO? – svick

Trả lời

2

Tôi đã đăng cùng một câu hỏi trong diễn đàn của Microsoft và họ đã trả lời hai câu trả lời cho tôi. Việc đầu tiên là:

Hi Claudio,

Trong Developer Preview có không phải là một cách dễ dàng để tạo riêng hoạt động async của bạn. Chúng tôi nhận thức được sự thiếu sót này và đang cố gắng để giải quyết vấn đề này cho lần phát hành tiếp theo. Trong khi đó, bạn có thể thiết kế API của mình là không đồng bộ và chúng tôi sẽ cung cấp hướng dẫn về cách chuyển đổi đồng bộ hóa thành không đồng bộ.

Cảm ơn

Raman Sharma, Visual C++

Khi tôi hỏi một cách khó khăn để làm điều này, anh chàng khác, có người chịu trách nhiệm về PPL nói với tôi:

Chúng tôi lập kế hoạch để làm mới gói mẫu, chúng tôi đã phát hành một số tuần trước và thêm một vài mẫu khi tạo các hoạt động không đồng bộ. Tôi mong rằng nó sẽ xảy ra trong một vài tuần hoặc lâu hơn. Nếu bạn giữ một con mắt trên blog của chúng tôi tại http://blogs.msdn.com/b/nativeconcurrency, bạn sẽ là người đầu tiên được biết.

Vì nó khó khăn như thế nào ... Giải pháp đa năng mà chúng tôi đang dự tính là khoảng 1000 dòng mã C++ sử dụng phong phú lập trình meta mẫu . Hầu hết trong số đó sẽ nằm trong tệp tiêu đề để bạn có thể tự mình khám phá nó . Trong khi một giải pháp ít chung có thể ít phức tạp hơn, bạn vẫn sẽ cần triển khai lớp cơ sở, hãy thực hiện quản lý nhà nước , xử lý lỗi, v.v. Tại thời điểm này, tôi không thể xem chi tiết , nhưng tôi sẽ nói rằng bạn sẽ yêu tác giả dễ dàng như thế nào để tác giả hoạt động không đồng bộ với PPL - vì vậy hãy treo trong đó!

Artur Laksberg PPL đội

Sau đó, không có giải pháp lúc bấy giờ. Cảm ơn tất cả.

2

Có, xem Ben Kuhn's // BUILD/talk: http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T Anh ấy cho biết cách tạo API không đồng bộ.

Hiện tại, không có giải pháp tốt cho các lớp cao cấp (C++/WX). Tuy nhiên, nếu bạn sử dụng các giao diện C++ mức thấp, bạn có thể sử dụng lớp WRL :: AsyncBase để giúp xây dựng các giao diện không đồng bộ của bạn.

Here là tài liệu về lớp AsyncBase.

+0

AFAICS, ông cho thấy cách xây dựng giao diện không đồng bộ bằng cách sử dụng lớp .Net 'AsyncInfoFactory', không có sẵn từ C++/CX. – svick

+1

PPL là giải pháp lâu dài, rõ ràng đó không phải là một lựa chọn ngay bây giờ. Nhưng các API async tương đối đơn giản. Hãy xem wrl \ async.h, lớp WRL :: AsyncBase cho phép bạn tạo một lớp C++ không đồng bộ. Lưu ý rằng nó chỉ hoạt động với các lớp C++ ở mức độ thấp, không phải các lớp mức cao, do đó có thể có một số thách thức để làm việc này trên bản dựng xem trước của nhà phát triển. –

+0

Cảm ơn tất cả các bạn. Nó có vẻ hợp lý hơn mặc dù mong đợi MS với một số giải pháp và các mẫu. Mặc dù vậy, tôi đang định kỳ cho tài liệu này, nhưng như bạn có thể thấy, họ đã không khuyến khích tôi đi theo con đường nào. –

4

Sử dụng create_async trong C++:

IAsyncOperationWithProgress<IBuffer^, unsigned int>^ RandomAccessStream::ReadAsync(IBuffer^ buffer, unsigned int count, InputStreamOptions options) 
{ 
    if (buffer == nullptr) 
     throw ref new InvalidArgumentException; 

    auto taskProvider = [=](progress_reporter<unsigned int> progress, cancellation_token token) 
    { 
     return ReadBytesAsync(buffer, count, token, progress, options); 
    }; 
    return create_async(taskProvider); 
} 

Sử dụng AsyncInfo.Run trong .NET:

public IAsyncOperation<IInfo> Async() 
{ 
    return AsyncInfo.Run(_ => 
     Task.Run<AType>(async() => 
     { 
      return await DoAsync(); 
     }) 
    ); 
} 
+0

Đây là từ khóa đang chờ trong C++/CX bây giờ? Và TPL nữa? :) Nhưng đây vẫn là một mẹo hay cho .NET –

+0

Tôi xin lỗi. Ngôn ngữ không được chỉ định trong câu hỏi. –

+0

Tôi cũng đã thêm một mã mẫu C++. –

0

Thật khó hiểu, nhưng có sự khác biệt giữa mã WinRT C++ và WRL. Bạn có thể sử dụng WRL để mã trực tiếp vào lớp ABI. WRL không sử dụng ngoại lệ, nhưng yêu thích các mẫu. Phong cách mã hóa khuyên dùng cho WinRT không giống như WRL.

Tôi không chắc chắn nếu tất cả mọi người thể làm điều này, nhưng sử dụng WRL bạn có nhu cầu chung để thực hiện một lớp kế thừa:

class CreateAysncOp: public RuntimeClass<IAsyncOperation<result_runtime_class*>,AsyncBase<IAsyncCompletedHandler<result_runtime_class*>> 
{ 
... 

Sau đó, bạn có thể sử dụng

hr = MakeAndInitialize<CreateAsyncOp, IAsyncOperation<type_foo*>>(...); 
Các vấn đề liên quan