私は地下鉄アプリケーションを開発しており、独自のクラスが実装する非同期操作をいくつか作成したいと考えています。
WinRT 操作 (CreateFileAsync など) を使用した非同期の例を見つけました。誰かが非同期メソッドを作成してそれを消費しているインスタンスは見つかりません。
私は地下鉄アプリケーションを開発しており、独自のクラスが実装する非同期操作をいくつか作成したいと考えています。
WinRT 操作 (CreateFileAsync など) を使用した非同期の例を見つけました。誰かが非同期メソッドを作成してそれを消費しているインスタンスは見つかりません。
今、あなたはそれを行うことができます。これを見てください:
http://code.msdn.microsoft.com/Windows-8-Asynchronous-08009a0d
C++を使用したWinRT非同期プロダクション
C++ で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);
}
.NET でAsyncInfo.Runを使用します。
public IAsyncOperation<IInfo> Async()
{
return AsyncInfo.Run(_ =>
Task.Run<AType>(async () =>
{
return await DoAsync();
})
);
}
同じ質問をMicrosoftフォーラムに投稿したところ、2つの回答がありました。最初は:
こんにちはクラウディオ、
Developer Previewには、独自の非同期操作を作成する簡単な方法はありません。私たちはこの欠点を認識しており、次の公開リリースのためにそれを解決しようとしています。それまでの間、APIを非同期として設計することができ、同期を非同期に変換する方法についてのガイダンスを提供します。
ありがとう
ラマンシャルマ、ビジュアルC ++
私がこれを行うための難しい方法を尋ねたとき、別の男、PPLの責任者が私に言った:
数週間前にリリースしたサンプルパックを更新し、非同期操作の作成時にいくつかのサンプルを追加する予定です。私はそれが数週間かそこらで起こることを期待しています。http://blogs.msdn.com/b/nativeconcurrencyで私たちのブログを監視している場合は、あなたが最初に知ることになります。
それがどれほど難しいかについて...私たちが考えている汎用ソリューションは、テンプレートメタプログラミングを多用する約1000行のC++コードです。そのほとんどはヘッダーファイルに含まれているので、自分で調べることができます。一般的でないソリューションはそれほど複雑ではありませんが、基本クラスを実装し、状態管理、エラー処理などを行う必要があります。現時点ではこれ以上詳しく説明することはできませんが、どのようにすればよいかわかります。 PPLを使用して非同期操作を作成するのは簡単です。
ArturLaksbergPPLチーム
そして、その時点で解決策はありません。皆さん、ありがとうございました。
はい、Ben Kuhn の //BUILD/ トークを参照してください: http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T 彼は非同期 API のビルド方法を示しています。
現時点では、高レベル (C++/WX) クラスに対する適切なソリューションはありません。ただし、低レベルの C++ インターフェイスを使用する場合は、WRL::AsyncBase クラスを使用して非同期インターフェイスを構築できます。
AsyncBaseクラスに関するドキュメントを次に示します。
ややこしいですが、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*>>(...);