我正在開發一個metro應用程序,我想創建一些我自己的類將實現的異步操作。如何使用IAsyncOperation接口使用WinRT進行自己的異步操作?
我發現只是使用WinRT操作(例如CreateFileAsync)的異步示例。我沒有發現有人在創建一個異步方法並使用它。
我正在開發一個metro應用程序,我想創建一些我自己的類將實現的異步操作。如何使用IAsyncOperation接口使用WinRT進行自己的異步操作?
我發現只是使用WinRT操作(例如CreateFileAsync)的異步示例。我沒有發現有人在創建一個異步方法並使用它。
我在微軟論壇發佈了同樣的問題,他們給了我兩個答覆。第一個是:
克勞迪奧嗨,
在開發者預覽版沒有創建自己的 異步操作的簡便方法。我們意識到這個缺點,並且正在努力爲下一個公開發布解決它。同時,您可以將您的API設計爲異步,並且我們將提供關於如何將 轉換爲異步的指導。
感謝
拉曼·夏爾馬的Visual C++
當我問硬盤的方式來做到這一點,另一個人,專人負責PPL說我:
我們我們計劃對樣本包進行更新,我們在幾周前發佈了幾個 ,並添加了一些關於創建異步操作的示例。 I 預計它會在幾個星期左右發生。如果您在我們的博客上登錄 ,請登錄http://blogs.msdn.com/b/nativeconcurrency,您將首先知道 。
至於有多難......的通用解決方案,我們 考慮的是C++代碼使得豐富的使用 模板元編程約1000行。大部分將在頭文件中,所以你可以自己探索它。雖然較不普遍的解決方案可能會更復雜,但您仍然需要實現一個基類,執行狀態 管理,錯誤處理等。此時我無法進入更多 的詳細信息,但我會說你會愛上用PPL編寫 異步操作是多麼容易 - 所以請掛在那裏!
阿圖爾Laksberg PPL團隊
然後,還有就是在那個時候沒有辦法解決。謝謝你們。
是的,請參閱Ben Kuhn的// BUILD/talk:http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T他演示瞭如何構建異步API。
目前,高級(C++/WX)類沒有好的解決方案。但是,如果使用低級C++接口,則可以使用WRL :: AsyncBase類來幫助構建異步接口。
Here是關於AsyncBase類的文檔。
AFAICS,他演示瞭如何使用.Net類「AsyncInfoFactory」構建異步接口,這在C++/CX中是不可用的。 – svick
PPL是長期的解決方案,顯然這不是一種選擇。但是異步API相對比較簡單。看一下wrl \ async.h,WRL :: AsyncBase類允許你創建一個異步的C++類。請注意,它僅適用於低級別的C++類,而不適用於高級類,因此在開發人員預覽版本中可能會遇到一些挑戰。 –
謝謝大家。雖然期望MS有一些解決方案和模式,但似乎更合理。即使如此,我反覆聽到這些材料,但正如你所看到的,他們並沒有鼓勵我遵循任何道路。 –
使用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();
})
);
}
這是C++/CX中的await關鍵字嗎?還有TPL呢? :)但是,這仍然是一個很好的技巧.NET –
對不起。該問題中未指定該語言。 –
我也添加了一個C++示例代碼。 –
這令人困惑,但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*>>(...);
爲什麼不你只是試圖根據(相當稀少的)文檔來實現這些方法嗎? – svick
很明顯,您對所涉及的內容沒有深入的瞭解。這是文檔的建議。即使如此,謝謝。 –
我不明白。文件建議詢問SO? – svick