6

私はメトロアプリケーションを開発しています。自分のクラスが実装する非同期操作をいくつか作成したいと思います。どのようにIASyncOperationインターフェイスを使用してWinRTで自分自身の非同期操作を行うことはできますか?

私は、WinRT操作(例:CreateFileAsync)を使用して非同期の例を見つけました。私は、誰かが非同期メソッドを作成し、それを消費しているところで何のインセンティブも見つけられません。

+0

なぜドン」を使用することができますあなたは、(むしろ不十分な)ドキュメンテーションに従ってメソッドを実装しようとしますか? – svick

+0

明らかに、関係するものについて深い知識はありません。これはドキュメンテーションが示唆していることです。 –

+2

私は分かりません。ドキュメンテーションはSOに尋ねることを示唆していますか? – svick

答えて

2

Microsoftフォーラムで同じ質問を投稿し、2件の返信をしました。最初は:

こんにちはクラウディオ、

開発者プレビューでは、独自の 非同期操作を作成する簡単な方法がありません。我々はこの欠点を認識しており、 を次の公的リリースのために解決しようとしています。その間、 APIをasyncとして設計し、 を非同期に変換する方法のガイダンスを提供します。われわれは

おかげ

ラマン・シャルマは、Visual C++

私はこれを行うには、ハードな方法、別の男を求め、PPLの責任誰かが私に言いましたサンプルパックをリフレッシュする予定で、数週間前に をリリースし、非同期操作の作成時にいくつかのサンプルを追加しました。私は それは数週間後に起こることを期待しています。弊社のブログで のアイをhttp://blogs.msdn.com/b/nativeconcurrencyのままにしておけば、まず になるでしょう。

私たちがしている汎用ソリューションは、約1000行のC++コードで、 テンプレートのメタプログラミングを多用しています。そのほとんどはヘッダファイルにありますので、 あなた自身でそれを探索することができます。それほど一般的ではない解決策は、 複雑ではありませんが、依然として基底クラスを実装する必要があります。 管理、エラー処理などこの時点で私は詳細には入りません 詳細は、作成するのがいかに簡単か 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*>>(...); 
関連する問題