4

宣言したメソッド内で Async メソッドを呼び出す必要があります。メソッドは値を返す必要があります。Windows ストアへの呼び出しを使いやすいクラスにラップしようとしています。私の方法は次のようになります。

bool Purchase(enum_InAppOption optionToPurchase);

enum_InAppOption購入するすべてのアプリ内オプションで構成される列挙型です。ある時点で、 に電話する必要がありますRequestProductPurchaseAsync。この呼び出しの結果によって、メソッドが を返すtrueかを返すかが決まりfalseます。私は c++/cx を初めて使用します (または少なくとも、現在から最後に c++ を使用するまでの間に長い歴史があります)。

は次のcreate_taskようになります。

create_task(CurrentAppSimulator::RequestProductPurchaseAsync(this->_LastProductId, false))

私が検討/試したオプション:

  1. タスクを返すと、ストアが抽象化されません

  2. タスクで待機を呼び出そうとしました。私は例外を持っていますAn invalid parameter was passed to a function that considers invalid parameters fatal.

  3. 使用しようとしましstructured_task_groupたが、これは非 void を返すメソッドを許可していないようです。または、間違った解釈を提供しようとしています。コンパイラはエラー C2064 を返します (ググっても何を変更すればよいかわかりません)

  4. タスクの配列を使用して、when_all

http://msdn.microsoft.com/en-us/library/dd492427.aspx#when_allで、ページの中央に次のコードが見つかりました。

array<task<void>, 3> tasks = 
{
    create_task([] { wcout << L"Hello from taskA." << endl; }),
    create_task([] { wcout << L"Hello from taskB." << endl; }),
    create_task([] { wcout << L"Hello from taskC." << endl; })
};

auto joinTask = when_all(begin(tasks), end(tasks));

// Print a message from the joining thread.
wcout << L"Hello from the joining thread." << endl;

// Wait for the tasks to finish.
joinTask.wait();

だから私はそれを次のコードに翻訳しようとしました:

array<task<Platform::String^>,1> tasks = {
    create_task(CurrentAppSimulator::RequestProductPurchaseAsync(this->_LastProductId, false))
};

コンパイラを含めたにもかかわらず、C2065 ('array': 宣言されていない識別子)、C2275 ('Concurrency::task<_ReturnType>': 式としてのこの型の不正な使用、およびこれら 2 つに続くエラーと思われるいくつかのエラーがスローされます。 .

要約すると、非同期タスクが完了した後にメソッドを返す方法を教えてください。これにより、非同期で行われている処理に基づいて意味のある結果を返すことができます。

4

2 に答える 2

2

非同期タスクが完了した後にメソッドを返す方法を教えてください。これにより、非同期で行われていることに基づいて意味のある結果を返すことができますか?

これはあまり意味がありません。戻る前に完了するのを待ちたい場合、「もの」は非同期ではありません。それが同期の定義です。

C++/CX を使用している場合、STA でまだ完了していないタスクを待機することはできません。そうしようとすると、例外がスローされます。STAを呼び出しPurchase()て非同期操作を開始する場合、その操作が完了するのを待ってから戻ることはできません。

代わりに.then、非同期操作が完了したときに別の操作を実行するために使用できます。呼び出し元のスレッドで継続を実行する必要がある場合は、継続コンテキストを渡してuse_current()、継続が正しいコンテキストで実行されるようにしてください。

于 2012-10-07T06:12:23.040 に答える