6

我正在開發一個metro應用程序,我想創建一些我自己的類將實現的異步操作。如何使用IAsyncOperation接口使用WinRT進行自己的異步操作?

我發現只是使用WinRT操作(例如CreateFileAsync)的異步示例。我沒有發現有人在創建一個異步方法並使用它。

+0

爲什麼不你只是試圖根據(相當稀少的)文檔來實現這些方法嗎? – svick

+0

很明顯,您對所涉及的內容沒有深入的瞭解。這是文檔的建議。即使如此,謝謝。 –

+2

我不明白。文件建議詢問SO? – svick

回答

2

我在微軟論壇發佈了同樣的問題,他們給了我兩個答覆。第一個是:

克勞迪奧嗨,

在開發者預覽版沒有創建自己的 異步操作的簡便方法。我們意識到這個缺點,並且正在努力爲下一個公開發布解決它。同時,您可以將您的API設計爲異步,並且我們將提供關於如何將 轉換爲異步的指導。

感謝

拉曼·夏爾馬的Visual C++

當我問硬盤的方式來做到這一點,另一個人,專人負責PPL說我:

我們我們計劃對樣本包進行更新,我們在幾周前發佈了幾個 ,並添加了一些關於創建異步操作的示例。 I 預計它會在幾個星期左右發生。如果您在我們的博客上登錄 ,請登錄http://blogs.msdn.com/b/nativeconcurrency,您將首先知道 。

至於有多難......的通用解決方案,我們 考慮的是C++代碼使得豐富的使用 模板元編程約1000行。大部分將在頭文件中,所以你可以自己探索它。雖然較不普遍的解決方案可能會更復雜,但您仍然需要實現一個基類,執行狀態 管理,錯誤處理等。此時我無法進入更多 的詳細信息,但我會說你會愛上用PPL編寫 異步操作是多麼容易 - 所以請掛在那裏!

阿圖爾Laksberg PPL團隊

然後,還有就是在那個時候沒有辦法解決。謝謝你們。

2

是的,請參閱Ben Kuhn的// BUILD/talk:http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T他演示瞭如何構建異步API。

目前,高級(C++/WX)類沒有​​好的解決方案。但是,如果使用低級C++接口,則可以使用WRL :: AsyncBase類來幫助構建異步接口。

Here是關於AsyncBase類的文檔。

+0

AFAICS,他演示瞭如何使用.Net類「AsyncInfoFactory」構建異步接口,這在C++/CX中是不可用的。 – svick

+1

PPL是長期的解決方案,顯然這不是一種選擇。但是異步API相對比較簡單。看一下wrl \ async.h,WRL :: AsyncBase類允許你創建一個異步的C++類。請注意,它僅適用於低級別的C++類,而不適用於高級類,因此在開發人員預覽版本中可能會遇到一些挑戰。 –

+0

謝謝大家。雖然期望MS有一些解決方案和模式,但似乎更合理。即使如此,我反覆聽到這些材料,但正如你所看到的,他們並沒有鼓勵我遵循任何道路。 –

4

使用create_async ++:

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); 
} 

使用AsyncInfo.Run在.NET:

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

這是C++/CX中的await關鍵字嗎?還有TPL呢? :)但是,這仍然是一個很好的技巧.NET –

+0

對不起。該問題中未指定該語言。 –

+0

我也添加了一個C++示例代碼。 –

0

這令人困惑,但WinRT C++代碼和WRL之間存在差異。您可以使用WRL直接編碼到ABI圖層。 WRL不使用例外,但喜歡模板。 WinRT的推薦編碼風格與WRL不同。

我不知道如果大家可以做到這一點,但使用WRL你一般需要實現一個繼承的類:

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

然後你可以使用

hr = MakeAndInitialize<CreateAsyncOp, IAsyncOperation<type_foo*>>(...);