(57)【特許請求の範囲】
【請求項１】
１つまたは複数のプロセッサを含むコンピューティングシステムで実装されるプログラムであって、前記１つまたは複数のプロセッサに、
特定のアプリケーションフレームワークに従って構築されたアプリケーションと、
前記特定のアプリケーションフレームワークに従って構築された前記アプリケーションに組み込まれるコンポーネントであって、非同期オペレーションを実行すべき場合に、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用された特定のアプリケーションフレームワークとは異なるアプリケーションフレームワークに従って標準関数呼出しを発行するように構成されたコンポーネントと、
前記アプリケーションを構築するのに使用された特定のアプリケーションフレームワークを識別する通知を検出して前記特定のアプリケーションフレームワークを識別し、前記コンポーネントから発行された前記標準関数呼出しを受け取り、前記標準関数呼び出しに応答して、識別された前記特定のアプリケーションフレームワークに従って前記非同期オペレーションを実行し、前記非同期オペレーションが完了した場合に識別された前記特定のアプリケーションフレームワークに従って前記非同期オペレーションの完了の通知を前記コンポーネントに発行するように構成された非同期オペレーションマネージャと
をシステムメモリ上でインスタンス化する機能を実行させることを特徴とするプログラム。
【請求項２】
前記１つまたは複数のプロセッサに、さらに、
前記特定のアプリケーションフレームワークが、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークであることを前記非同期オペレーションマネージャに通知するように構成されたアプリケーションフレームワークモジュールを前記システムメモリ上でインスタンス化する機能を実行させることを特徴とする請求項１に記載のプログラム。
【請求項３】
１つまたは複数のプロセッサと、
システムメモリと
を備えるコンピューティングシステムであって、
前記１つまたは複数のプロセッサに、
特定のアプリケーションフレームワークに従って構築されたアプリケーションと、
前記特定のアプリケーションフレームワークに従って構築された前記アプリケーションに組み込まれるコンポーネントであって、非同期オペレーションを実行すべき場合に、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用された特定のアプリケーションフレームワークとは異なるアプリケーションフレームワークに従って標準関数呼出しを発行するように構成されたコンポーネントと、
前記アプリケーションを構築するのに使用された特定のアプリケーションフレームワークを識別する通知を検出して前記特定のアプリケーションフレームワークを識別し、前記コンポーネントから発行された前記標準関数呼出しを受け取り、前記標準関数呼び出しに応答して、識別された前記特定のアプリケーションフレームワークに従って前記非同期オペレーションを実行し、前記非同期オペレーションが完了した場合に識別された前記特定のアプリケーションフレームワークに従って前記非同期オペレーションの完了の通知を前記コンポーネントに発行するように構成された非同期オペレーションマネージャと
を前記システムメモリ上でインスタンス化する機能を実行させることを特徴とするコンピューティングシステム。
【請求項４】
前記１つまたは複数のプロセッサに、
前記特定のアプリケーションフレームワークが、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークであることを前記非同期オペレーションマネージャに通知するように構成されたアプリケーションフレームワークモジュールを前記システムメモリ上でインスタンス化する機能を実行させることを特徴とする請求項３に記載のコンピューティングシステム。
【請求項５】
アプリケーションフレームワークを使用して構築された、システムメモリ上でインスタンス化されるアプリケーションを実行することができる、１つまたは複数のプロセッサを含むコンピューティングシステムにおいて、前記アプリケーションは前記システムメモリ上でインスタンス化される１つまたは複数のコンポーネントを組み込み、前記コンポーネントのうち少なくとも１つに対して、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークとは異なるアプリケーションフレームワークに従って非同期オペレーションを実行する方法であって、前記１つまたは複数のプロセッサは、
前記コンポーネントから標準関数呼出しを受け取る動作であって、前記標準関数呼出しが、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークとは異なるアプリケーションフレームワークに従って発行される動作と、
前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークを識別する通知を検出して、前記コンポーネントが組み込まれた前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークを識別する動作と、
受け取った前記標準関数呼出しに応答して、識別された前記アプリケーションフレームワークに従って実行すべき前記非同期オペレーションを実行する動作と、
前記非同期オペレーションが完了した場合に、識別された前記アプリケーションフレームワークに従って前記コンポーネントに前記非同期オペレーションの完了の通知を発行する動作と
を実行することを特徴とする方法。
【請求項６】
前記アプリケーションフレームワークを識別する通知は、
前記アプリケーションフレームワークに特有の前記システムメモリ上でインスタンス化されるアプリケーションフレームワークモジュールから受け取られることを特徴とする請求項５に記載の方法。
【請求項７】
前記完了の通知を発行する動作は、
任意のスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項５に記載の方法。
【請求項８】
前記非同期オペレーションの完了の通知を発行する動作は、
ユーザインターフェースをレンダリングするのに使用されるスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項５に記載の方法。
【請求項９】
前記非同期オペレーションの完了の通知を発行する動作は、
ユーザインターフェースをレンダリングするのに使用されないスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項５に記載の方法。
【請求項１０】
前記非同期オペレーションの完了の通知を発行する動作は、
前記標準関数呼出しを発行するのに使用される前記スレッドと同一のスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項５に記載の方法。
【請求項１１】
前記非同期オペレーションの完了の通知を発行する動作は、
前記アプリケーションを記述するコードを実行する、同時にアクティブとなる２つのスレッドが存在しないという点で前記オペレーションがシリアル化されるという条件で、任意のスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項５に記載の方法。
【請求項１２】
アプリケーションフレームワークを使用して構築された、システムメモリ上でインスタンス化されるアプリケーションを実行することができる、１つまたは複数のプロセッサを含むコンピューティングシステムにおいて、前記アプリケーションは前記システムメモリ上でインスタンス化される１つまたは複数のコンポーネントを組み込み、前記コンポーネントのうち少なくとも１つに対して、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークとは異なるアプリケーションフレームワークに従って非同期オペレーションを実行する方法を前記１つまたは複数のプロセッサに実施させるためのコンピュータ実行可能命令を有するコンピュータ可読記録媒体であって、前記１つまたは複数のプロセッサに、
前記コンポーネントから標準関数呼出しを受け取る動作であって、前記標準関数呼出しが、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークとは異なるアプリケーションフレームワークに従って発行される動作と、
前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークを識別する通知を検出して、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークを識別する動作と、
受け取った前記標準関数呼出しに応答して、識別された前記アプリケーションフレームワークに従って実行すべき前記非同期オペレーションを実行する動作と、
前記非同期オペレーションが完了した場合に、識別された前記アプリケーションフレームワークに従って前記コンポーネントに前記非同期オペレーションの完了の通知を発行する動作と
を含む方法を実行させるためのコンピュータ実行可能命令を有することを特徴とするコンピュータ可読記録媒体。
【請求項１３】
前記アプリケーションフレームワークを識別する通知は、
前記アプリケーションフレームワークに特有の前記システムメモリ上でインスタンス化されるアプリケーションフレームワークモジュールから受け取られることを特徴とする請求項１２に記載のコンピュータ可読記録媒体。
【請求項１４】
前記完了の通知を発行する動作は、
任意のスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項１２に記載のコンピュータ可読記録媒体。
【請求項１５】
前記完了の通知を発行する動作は、
ユーザインターフェースをレンダリングするのに使用されるスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項１２に記載のコンピュータ可読記録媒体。
【請求項１６】
前記完了の通知を発行する動作は、
ユーザインターフェースをレンダリングするのに使用されないスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項１２に記載のコンピュータ可読記録媒体。
【請求項１７】
前記完了の通知を発行する動作は、
前記標準関数呼出しを発行するのに使用される前記スレッドと同一のスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項１２に記載のコンピュータ可読記録媒体。
【請求項１８】
アプリケーションフレームワークを使用して構築された、システムメモリ上でインスタンス化されるアプリケーションを実行することができる、１つまたは複数のプロセッサを含むコンピューティングシステムにおいて、前記アプリケーションは前記システムメモリ上でインスタンス化される１つまたは複数のコンポーネントを組み込み、前記コンポーネントのうち少なくとも１つに対して、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークとは異なるアプリケーションフレームワークに従って非同期オペレーションを実行する方法であって、前記コンピューティングシステムは前記１つまたは複数のプロセッサに、
前記コンポーネントから標準関数呼出しを受け取る動作であって、前記標準関数呼出しが、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークとは異なるアプリケーションフレームワークに従って発行される動作と、
前記標準関数呼出しが前記アプリケーションフレームワークとは異なるアプリケーションフレームワークに従って発行されたとしても、前記標準関数呼出しに応答して、前記アプリケーションフレームワークに従って非同期オペレーションを実行する動作と
を実行させることを特徴とする方法。
【請求項１９】
前記非同期オペレーションを実行する動作は、
前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークの識別の通知を検出して、前記コンポーネントが組み込まれる前記アプリケーションを構築するのに使用される前記アプリケーションフレームワークを識別する動作と、
識別された前記アプリケーションフレームワークに従って実行すべき前記非同期オペレーションを実行する動作と、
前記非同期オペレーションが完了した場合に、識別された前記アプリケーションフレームワークに従って前記コンポーネントに前記非同期オペレーションの完了の通知を発行する動作と
を含むことを特徴とする請求項１８に記載の方法。
【請求項２０】
前記アプリケーションフレームワークを識別する通知は、
前記アプリケーションフレームワークに特有の前記システムメモリ上でインスタンス化されるアプリケーションフレームワークモジュールから受け取られることを特徴とする請求項１９に記載の方法。
【請求項２１】
前記完了の通知を発行する動作は、
任意のスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項１９に記載の方法。
【請求項２２】
前記完了の通知を発行する動作は、
ユーザインターフェースをレンダリングするのに使用されるスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項１９に記載の方法。
【請求項２３】
前記完了の通知を発行する動作は、
ユーザインターフェースをレンダリングするのに使用されないスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項１９に記載の方法。
【請求項２４】
前記完了の通知を発行する動作は、
前記標準関数呼出しを発行するのに使用される前記スレッドと同一のスレッド上で前記完了の通知を発行する動作を含むことを特徴とする請求項１９に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェア開発技術に関する。より詳細には、本発明は、非同期オペレーションマネージャが非同期コンポーネントに標準化インターフェースを提供し、それによって、非同期コンポーネントが組み込まれるアプリケーションを構築するのに使用される特定のアプリケーションフレームワークの如何にかかわらず、非同期コンポーネントが非同期オペレーションマネージャと同一の方法でインターフェースするメカニズムに関する。
【背景技術】
【０００２】
コンピューティング技術は、我々が働き、遊ぶ仕方を一変させた。コンピューティング技術は、相互接続処理、メモリ、通信、およびユーザインターフェース装置を含む精巧なハードウェアに依拠する。実質上無限のアプリケーションを使用可能とするために、ソフトウェアは、こうした様々な物理的構成要素が互いに、およびユーザとどのように対話するかを制御する。
【０００３】
ソフトウェアは、ソースコードを最もしばしば使用して、人間のプログラマによって作成される。ソースコードは、人間のプログラマにとって比較的直感的な言語およびシンボルを含む。しかし、ソースコードをプロセッサで直接解釈することはできない。したがって、機能するソフトウェアを得るために、ソースコードは、ソフトウェアの機能を使用可能にするために特定のどんなアクションを実行すべきかに関してプロセッサに命令することができるバイナリ命令／データに解釈またはコンパイルされる。
【０００４】
ソフトウェアは、時が進むにつれてますます複雑になりつつある。アプリケーションが数千、さらには数百万の別個のバイナリ命令を含むことも全く珍しくない。ソフトウェア開発におけるこの急速な進歩は主に、ひとたび特定の低レベルタスクを実行するコンポーネントが構築されたなら、アプリケーションの高レベル機能が全く異なる場合であっても、その低レベルタスクを実行すべき多数の異なるアプリケーションにそのコンポーネントを組み込むことができることによって可能となっている。コンポーネントは、実行された場合に１つまたは複数の機能を実施する離散的な１組のコンピュータ実行可能命令である。コンポーネントは、他のソフトウェアコンポーネントまたはアプリケーションによって呼び出すことができる。オブジェクト指向プログラミングがこれを可能にする。したがって、アプリケーションプログラマは、コンポーネントと適切にインターフェースする関数呼出しを配置することによってアプリケーションに組み込むことができるしばしば多種多様なコンポーネントにアクセスすることができる。アプリケーションは多数の異なるコンポーネントを組み込むことができる。
【０００５】
アプリケーションは、広く使用される多数のアプリケーションフレームワークの１つを使用して構築することができる。アプリケーションフレームワークの例には、ＷＩＮＤＯＷＳ（登録商標）フォームクライアント側ユーザインターフェース（ＵＩ）プログラミングフレームワーク、ＡＳＰ．ＮＥＴサーバ側ＵＩプログラミング／ＨＴＴＰフレームワーク、フリースレッド化コンソールアプリケーション、ＳＱＬサーバに組み込まれたアプリケーションなどが含まれる。通常、複数のアプリケーションフレームワークの１つを使用して書き込まれた可能性のあるアプリケーションにとってコンポーネントが使用可能となるには、コンポーネントは通常、複数のフレームワークのいずれかに追従するアプリケーションで動作するように具体的に設計および記述されるか、各フレームワークに対応するコンポーネントが存在しなければならない。
【０００６】
コンポーネントが非同期オペレーションを実行する場合に特定のアプリケーションフレームワークを考慮に入れることは重要である。非同期オペレーションは、他のプロセスの進行中に、実行の別のスレッド上または何らかのハードウェア上で完了に向かって進行するオペレーションである。非同期オペレーションが完了した場合、イベント通知が行われ、目標のアプリケーションフレームワークのコンテキストで、したがって目標のアプリケーションフレームワークの規則に合わせて書かれたコードが実行される。しかし、通知が返されるコンテキストおよびスレッドは、コンポーネントを組み込むアプリケーションを構築するのに使用されるアプリケーションフレームワークに大いに依存する。したがってコンポーネントは、対応するアプリケーションフレームワークで使用される特定のスレッド化／同時処理モデルに従って通知が発行された場合に、通知を受け取る（次いで、対応する通知をアプリケーションに送る）準備ができているように組み込まれる。そうでない場合、非同期オペレーションは失敗する可能性がある。
【０００７】
したがって、非同期オペレーションが複数のフレームワークで動作するためには、別個のコンポーネントがアプリケーションフレームワークのうちの１つについて構築され、別個のコンポーネントが別のアプリケーションフレームワークについて構築され、アプリケーションフレームワークのすべてについて同様に構築される。代替として、複数のアプリケーションフレームワークの任意の１つと共に動作するようにコンポーネントを構築することもできる。しかし、いずれの場合でも、コンポーネントの作者は、各アプリケーションフレームのワークスレッド化／同時処理モデルを考慮する必要があり、明示的に起草されたソースコードを介してスレッド化／同時処理モデル問題に対処する必要がある。
【発明の開示】
【発明が解決しようとする課題】
【０００８】
したがって、コンポーネントの作者がスレッド化／同時処理モデルなどのアプリケーションフレームワーク特有の問題を考慮しなくとも、コンポーネントが多種多様なアプリケーションフレームワークの下で動作することを可能にするメカニズムがあれば有利であろう。あるコンポーネントはあるアプリケーションフレームワークでしか動作しないので、アプリケーションがコンポーネントの使用に限定されなければさらに有利であろう。
【課題を解決するための手段】
【０００９】
従来の現況技術に伴う上記の問題は、本発明の原理によって克服される。本発明の原理では、非同期オペレーションマネージャにより、コンポーネントを組み込むアプリケーションを構築するのに使用されるアプリケーションフレームの如何にかかわらず、コンポーネントが非同期オペレーションを標準化された方法で実行することが可能となる。これにより、単一コンポーネントをより容易に構築することが可能となると共に、アプリケーションを構築するのにどのアプリケーションフレームワークが使用されたかにかかわらず、そのコンポーネントが非同期オペレーションを実行することが可能となる。
【００１０】
本発明の原理によれば、アプリケーションが、特定のアプリケーションフレームワークに従って構築される。コンポーネントがそのアプリケーションに組み込まれる。非同期オペレーションを実行すべき場合、コンポーネントが、アプリケーションを構築するのに使用された特定のアプリケーションフレームワークとは無関係の方法で標準関数呼出しを発行するように構成される。非同期オペレーションマネージャが、アプリケーションを構築するのに使用された特定のアプリケーションフレームワークを検出し、標準関数呼出しを受け取り、アプリケーションフレームワークのスレッド化／同時処理モデルに従って非同期オペレーションを実行し、非同期オペレーションが完了した場合にスレッド化／同時処理モデルに従う方法で通知をコンポーネントに発行するように構成される。非同期オペレーションマネージャは、アプリケーションフレームワーク自体から通知または関数呼出しを受け取ることによってアプリケーションフレームワークを判定することができる。
【００１１】
本発明の追加の特徴および利点を以下で説明する。本発明の追加の特徴および利点の一部はその説明から明らかとなり、または本発明を実施することによって理解することができよう。本発明の特徴および利点は、頭記の特許請求の範囲で具体的に指摘される各機器と、各機器の組合せによって実現し、得ることができる。本発明の上記およびその他の特徴は、以下の説明と特許請求の範囲からより完全に明らかとなり、または下記で説明する本発明を実施することによって理解することができよう。
【００１２】
本発明の上記で列挙したあるいはその他の利点および特徴を得る方法を説明するために、添付の図面に示される本発明の特定の実施形態を参照しながら、上記で簡潔に説明した本発明のより具体的な説明を行う。これらの図面は本発明の典型的な実施形態だけを示しており、したがって本発明の範囲を限定するものとみなすべきでないことを理解した上で、添付の図面を使用することにより、本発明をさらに具体的かつ詳細に説明する。
【発明を実施するための最良の形態】
【００１３】
本発明の原理は、非同期オペレーションマネージャにより、コンポーネントを組み込むアプリケーションを構築するのに使用されるアプリケーションフレームの如何にかかわらず、コンポーネントが非同期オペレーションを標準化された方法で実行することが可能となるメカニズムに関する。これにより、単一コンポーネントをより容易に構築することが可能となると共に、アプリケーションを構築するのに複数のアプリケーションフレームワークのうちどれが使用されたかにかかわらず、そのコンポーネントが非同期オペレーションを実行することが可能となる。
【００１４】
本発明の範囲内の実施形態には、コンピュータ実行可能命令またはデータ構造を搬送し、あるいはそれが格納されたコンピュータ可読媒体が含まれる。このようなコンピュータ可読媒体は、汎用コンピュータまたは専用コンピュータでアクセスすることができる入手可能などんな媒体でもよい。例えば、限定はしないがこのようなコンピュータ可読媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭまたはその他の光ディスクストレージ、磁気ディスクストレージまたはその他の磁気記憶装置などの物理的記憶媒体、あるいはコンピュータ実行可能命令またはデータ構造の形態の所望のプログラムコード手段を搬送または記憶するのに使用することができ、かつ汎用コンピュータまたは専用コンピュータでアクセスすることができるその他のどんな媒体も含むことができる。
【００１５】
ネットワークまたはその他の通信接続（有線、無線、あるいは有線と無線の組合せ）を介して情報がコンピュータに転送または提供される場合、コンピュータは、その接続をコンピュータ可読媒体として適切に認識する。したがって、そのようなどんな接続もコンピュータ可読媒体と呼ぶことは適切である。上記の組合せもまた、コンピュータ可読媒体の範囲内に含まれるべきである。コンピュータ実行可能命令は、例えば、ある機能または１群の機能を汎用コンピュータ、専用コンピュータ、または専用処理装置に実施させるどんな命令およびデータも含む。コンピュータ実行可能命令は、例えばバイナリ命令、アセンブリ言語などの中間フォーマット命令、さらにはソースコードでよい。必須ではないが、ネットワーク環境内のコンピュータによって実行されるプログラムモジュールなどのコンピュータ実行可能命令の一般的状況で本発明を説明する。一般に、プログラムモジュールは、特定のタスクを実行し、または特定の抽象データタイプを実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。
【００１６】
パーソナルコンピュータ、ハンドヘルド装置、マルチプロセッサシステム、マイクロプロセッサベースの／プログラム可能な消費者向け電子機器、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータなどを含む多くのタイプのコンピュータシステム構成を用いてネットワークコンピューティング環境で本発明を実施できることを当業者は理解されよう。本発明は、（有線リンク、無線リンク、または有線リンクと無線リンクの組合せによって）通信ネットワークを介してリンクされるローカル／リモート処理装置によってタスクが実行される分散コンピューティング環境でも実施することができる。分散コンピューティング環境では、プログラムモジュールは、ローカルメモリ記憶装置とリモートメモリ記憶装置のどちらにも位置することができる。
【００１７】
図１に、本発明の原理を使用することができるコンピュータ１２０の形態の適切なコンピューティング環境を示す。コンピュータ１２０は、処理装置１２１と、システムメモリ１２２と、システムメモリ１２２を含む様々なシステム構成要素を処理装置１２１に結合するシステムバス１２３とを含む。
【００１８】
システムバス１２３は、様々なバスアーキテクチャのうちのいずれかを用いたメモリバスまたはメモリコントローラ、周辺機器バス、およびローカルバスを含むいくつかのタイプのバス構造のうちのいずれでもよい。システムメモリは、読取り専用メモリ（ＲＯＭ）１２４およびランダムアクセスメモリ（ＲＡＭ）１２５を含む。スタートアップ時などにコンピュータ１２０内の要素間で情報を転送する助けになる基本ルーチンを含む基本入出力システム（ＢＩＯＳ）１２６が、ＲＯＭ１２４内に格納される。
【００１９】
コンピュータ１２０はまた、磁気ハードディスク１３９を読み書きするハードディスクドライブ１２７と、取外し可能磁気ディスク１２９を読み書きする磁気ディスクドライブ１２８と、ＣＤ−ＲＯＭ、またはその他の光媒体などの取外し可能光ディスク１３１を読み書きする光ディスクドライブ１３０も含むことができる。磁気ハードディスクドライブ１２７、磁気ディスクドライブ１２８、および光ディスクドライブ１３０は、それぞれハードディスクドライブインターフェース１３２、磁気ディスクドライブインターフェース１３３、および光ディスクドライブインターフェース１３４によってシステムバス１２３に接続される。各ドライブと、それに関連するコンピュータ可読媒体は、コンピュータ１２０向けに、コンピュータ実行可能命令、データ構造、プログラムモジュール、およびその他のデータの不揮発性記憶を実現する。本明細書で説明する例示的環境では、磁気ハードディスク１３９、取外し可能磁気ディスク１２９、および取外し可能光ディスク１３１を利用するが、磁気カセット、フラッシュメモリカード、デジタルビデオディスク、ベルヌーイカートリッジ、ＲＡＭ、ＲＯＭなどを含む、データを格納するためのその他のタイプのコンピュータ可読媒体も使用することができる。
【００２０】
オペレーティングシステム１３５、１つまたは複数のアプリケーションプログラム１３６、他のプログラムモジュール１３７、およびプログラムデータ１３８を含む１つまたは複数のプログラムモジュールを有するプログラムコード手段は、ハードディスク１３９、磁気ディスク１２９、光ディスク１３１、ＲＯＭ１２４、またはＲＡＭ１２５上に格納することができる。ユーザは、キーボード１４０、ポインティングデバイス１４２、あるいはマイクロフォン、ジョイスティック、ゲームパッド、衛星パラボラアンテナ、スキャナなどのその他の入力装置（図示せず）を介してコンピュータ１２０にコマンドおよび情報を入力することができる。上記およびその他の入力装置はしばしば、システムバス１２３に結合されたシリアルポートインターフェース１４６を介して処理装置１２１に接続される。代替として、入力装置は、パラレルポート、ゲームポート、ユニバーサルシリアルバス（ＵＳＢ）などのその他のインターフェースによって接続することもできる。モニタ１４７または他のディスプレイ装置もまた、ビデオアダプタ１４８などのインターフェースを介してシステムバス１２３に接続される。モニタに加えて、パーソナルコンピュータは一般に、スピーカやプリンタなどのその他の周辺出力装置（図示せず）を含む。
【００２１】
コンピュータ１２０は、リモートコンピュータ１４９ａおよび１４９ｂなどの１つまたは複数のリモートコンピュータに対する論理接続を用いて、ネットワーク環境で動作することができる。リモートコンピュータ１４９ａおよび１４９ｂはそれぞれ、別のパーソナルコンピュータ、サーバ、ルータ、ネットワークＰＣ、ピア装置、またはその他の共通ネットワークノードでよく、一般にはコンピュータ１２０に関する上述の要素のうちの多数またはすべてを含むが、図１にはメモリ記憶装置１５０ａおよび１５０ｂと、その関連するアプリケーションプログラム１３６ａおよび１３６ｂだけを示してある。図１に示す論理接続は、ローカルエリアネットワーク（ＬＡＮ）１５１およびワイドエリアネットワーク（ＷＡＮ）１５２を含む。これらは単に例として示したに過ぎず、限定的なものではない。このようなネットワーキング環境は、オフィス全体または企業全体のコンピュータネットワーク、イントラネット、およびインターネットで一般的なものである。
【００２２】
ＬＡＮネットワーキング環境で使用する場合、コンピュータ１２０は、ネットワークインターフェース／アダプタ１５３を介してローカルネットワーク１５１に接続される。ＷＡＮネットワーキング環境で使用する場合、コンピュータ１２０は、モデム１５４、無線リンク、あるいはインターネットなどの広域エリアネットワーク１５２を介して通信を確立するその他の手段を含む。モデム１５４は内蔵でも外付けでもよく、シリアルポートインターフェース１４６を介してシステムバス１２３に接続される。ネットワーク環境では、コンピュータ１２０に関して示したプログラムモジュールまたはその一部は、リモートメモリ記憶装置内に格納することができる。図示するネットワーク接続は例示的なものであって、広域エリアネットワーク１５２を介して通信を確立するその他の手段も使用できることを理解されよう。
【００２３】
図１は本発明に適した動作環境を表すが、本発明の原理は、ネットワークサイトに対してブラウジングすることができるどんなコンピューティングシステムでも使用することができる。図１に示すコンピューティングシステムは単なる例に過ぎず、本発明の原理を実施することのできる多種多様な環境の小部分さえも決して表していない。この説明および特許請求の範囲において、「コンピューティングシステム」とは、大まかには、ソフトウェアを使用して１つまたは複数の機能を実行することができる任意のハードウェアコンポーネントと定義される。コンピューティングシステムの例には、デスクトップコンピュータ、ラップトップコンピュータ、携帯情報端末（ＰＤＡ）、電話、あるいは処理能力を有する任意のその他のシステムまたは装置が含まれる。
【００２４】
図２に、本発明の原理を説明する際の助けとなる階層２００を示す。階層２００は、何らかの１つの特定のコンピューティングシステム上にある必要はない。階層２００は、水平楕円２０１Ｉによって表される潜在的にさらに多くのアプリケーションの中のアプリケーション２０１Ａから２０１Ｈを含むいくつかのアプリケーション２０１を含む。こうしたアプリケーションは、一般にソフトウェアアプリケーションを表す。ソフトウェアアプリケーションは通常、作者にソースコードを起草させることによって作成される。次いで、コンパイラ（またはインタプリタ）が、そのソースコードを、プロセッサが読み取って従うことができるコンピュータ実行可能命令にコンパイル（または解釈）する。
【００２５】
オブジェクト指向プログラミングの利点の１つは、別々に構築したコンポーネントをアプリケーションに組み込むことが可能なことである。コンポーネントは、実行された場合に１つまたは複数の機能を実施する離散的な１組のコンピュータ実行可能命令である。コンポーネントは、他のソフトウェアコンポーネントまたはアプリケーションによって呼び出すことができる。別々に構築したコンポーネントを単に関数呼出しによってアプリケーションに組み込むことができるので、アプリケーションがそのコンポーネントによって提供される機能を有するべきであるごとに、コンポーネントを再構築する必要がない。したがって、オブジェクト指向プログラミングにより、アプリケーション作者が他のアプリケーション作者の作品を組み込むことが可能となり、それによってアプリケーション作者が、他のアプリケーション作者によって既に対処されている詳細なオペレーションで停滞するのではなく、アプリケーションのより先進の機能により注意を集中することが可能となる。コンポーネントを再設計および再構築する代わりに、アプリケーション作者がする必要があるのは、アプリケーションが適切に構築された関数呼出しをコンポーネントに対して行うように、かつアプリケーションがコンポーネントから受け取った関数呼出しを適切に解釈することができるように十分なコードを起草することだけである。コンポーネント設計者は通常、関数呼出しを行い、関数呼出しを受け取るためのコンポーネント設計者の仕様を文書化して、アプリケーション設計者がそれを行うことができるようにする。
【００２６】
図２に戻ると、階層は、水平楕円２０２Ｇによって表される潜在的にさらに多くのコンポーネントの中のコンポーネント２０２Ａから２０２Ｆを含むいくつかのコンポーネント２０２を含む。こうしたコンポーネント２０２は、コンポーネント作成メカニズムと、その後に続く反復関数呼出し／戻りメカニズムとによって、アプリケーションに組み込むことが可能となるように構築することができるコンポーネントを表す。
【００２７】
アプリケーション２０１は、いくつかの使用可能なアプリケーションフレームワーク２０４の１つを使用して構築することができる。アプリケーションフレームワークは、水平楕円２０４Ｅによって表される潜在的にさらに多くのアプリケーションフレームワークの中のアプリケーションフレームワーク２０４Ａから２０４Ｄを含む。アプリケーションフレームワークは、適切に機能するソフトウェアアプリケーションの構築を実施する環境および１組のツールを提供する。アプリケーションフレームワークの例には、ＷＩＮＤＯＷＳ（登録商標）フォームクライアント側ユーザインターフェース（ＵＩ）プログラミングフレームワーク、ＡＳＰ．ＮＥＴサーバ側ＵＩプログラミング／ＨＴＴＰフレームワーク、フリースレッド化コンソールアプリケーション、ＳＱＬサーバに組み込まれたアプリケーション、および現在開発中、または将来開発される可能性のあるその他の物が含まれる。アプリケーションフレームワークはまた、しばしば当技術分野で「アプリケーションモデル」とも呼ばれる。
【００２８】
通常使用可能なコンポーネントに比べて、通常使用可能なアプリケーションフレームワークは比較的少数であり、通常使用可能なアプリケーションに比べて、通常使用可能なコンポーネントは比較的少数である。図２では、この現象を示すために、コンポーネント２０２よりも多数のアプリケーション２０１が示されており、アプリケーションフレームワーク２０４よりも多数のコンポーネント２０２が示されているが、アプリケーション２０１、コンポーネント２０２、およびアプリケーションフレームワーク２０４は決して慣例的なものではない。
【００２９】
階層２００はまた、非同期オペレーションマネージャ２０３も含む。前述のように、異なるアプリケーションフレームワークは非同期オペレーションとなった場合に異なるスレッド化／同時処理モデルを有する。非同期オペレーションは、アプリケーションレベルプロセスの進行中に、実行の別のスレッド上またはいくつかのハードウェア上で完了に向かって進行するオペレーションである。一部のアプリケーションフレームワークは、非同期オペレーションが完了した場合に実行することができるスレッドに関して制限を持たない。別のアプリケーションは、非同期オペレーションがユーザインターフェースをレンダリングするのに使用されるのと同一のスレッドなど特定のスレッド上で実行することを必要とする可能性がある。別のアプリケーションは、ユーザインターフェースをレンダリングするのに使用するスレッド以外のスレッド上で実行することを必要とする可能性がある。別のアプリケーションは、非同期オペレーションが非同期オペレーションを開始するのに使用されるのと同一のスレッド上で実行することを必要とする可能性がある。さらに別のアプリケーションは、何らかの特定のスレッド上に戻ることに関して要件を持たないが、オペレーションを「シリアル化」することを必要とする可能性がある。すなわち、任意の所与の時間に複数のオペレーションが進行することはない。
【００３０】
通常は、バックグラウンドで実行することがより望ましい非同期オペレーション（ファイルダウンロードなど）を実行するコンポーネントを構築する場合、コンポーネント自体が、コンポーネントを潜在的に組み込むことのできるアプリケーションを構築するのに使用されるアプリケーションフレームワークのスレッド化／同時処理モデルを明示的に処理するコードを含むことが必要である。したがって、そのようなコードを起草するのに、特にコンポーネントが複数のアプリケーションフレームワークを使用して構築されるアプリケーションに潜在的に組み込まれる可能性がある場合に、著しい労力が費やされる。さらに悪いことに、異なるフレームワークに対処するために複数のコンポーネントが構築されている可能性がある。さらに、あらゆる既存のアプリケーションフレームワーク用に書かれたコンポーネントであっても、新たに導入されたアプリケーションフレームワークでは通常は動作しない。
【００３１】
非同期オペレーションマネージャ２０３は、使用中のアプリケーションフレームワークが何かをコンポーネントが明示的に指定する必要がないように、標準インターフェース２０３Ａを使用してコンポーネント２０２とインターフェースする。その代わりに、コンポーネントは単に、標準インターフェース２０３Ａを使用して、非同期オペレーションに標準関数呼出しを行う。さらに、アプリケーションフレームワーク２０４は、標準インターフェース２０３Ｂを使用して、非同期オペレーションマネージャ２０３と通信することができる。
【００３２】
前述のように、階層２００を同一のコンピューティングシステム上に実装する必要はない。しかし、直線２１１、２１２と、矢印２２１、２２２、および２２３で、アプリケーション２０１Ｄ、コンポーネント２０２Ｃ、非同期オペレーションマネージャ２０３、およびアプリケーションフレームワーク２０４Ａの間の相互接続関係を示す。本発明の原理を例示するために、この説明の残りの部分全体を通じて、アプリケーション２０１Ｄ、コンポーネント２０２Ｃ、非同期オペレーションマネージャ２０３、およびアプリケーションフレームワーク２０４Ａが同一のコンピューティングシステム上で動作中であり、したがってシステムメモリでインスタンス化することができると仮定する。このようなコンピューティングシステムの一例を図１のコンピュータ１２０として示すが、どんなコンピューティングシステムでも十分である。
【００３３】
相互接続線２１２で表されるように、アプリケーション２０１Ｄは、アプリケーションフレームワーク２０４Ａを使用して構築された。相互接続線２１１で表されるように、コンポーネント２０２Ｃがアプリケーション２０１Ｄに組み込まれる。コンポーネント２０２Ｃを作成した後、コンポーネント２０２Ｃが、非同期オペレーションを開始するために、標準インターフェース２０３Ａを介して非同期オペレーションマネージャ２０３に対して標準関数呼出し２２２を行う。アプリケーションフレームワーク２０４Ａまたは別のモジュールは、非同期オペレーションを要求するコンポーネント２０２Ｃが組み込まれるアプリケーション２０１Ｄを構築するのに使用されるアプリケーションフレームワークの識別を非同期コンポーネントに通知することができる（矢印２２１で表す）。非同期オペレーションが完了した場合に、非同期オペレーションマネージャ２０３は、矢印２２３で表すように、非同期オペレーションの完了をコンポーネント２０２Ｃに通知する。
【００３４】
図３に、コンポーネントのうち少なくとも１つが、コンポーネントが組み込まれるアプリケーションを構築するのに使用されるアプリケーションフレームワークとは無関係な方法で非同期オペレーションを実行する方法３００を示す。図２の状況では、非同期オペレーションを実行するコンポーネントはコンポーネント２０２Ｃであり、コンポーネントを組み込むアプリケーションはアプリケーション２０１Ｄである。
【００３５】
方法３００は、非同期オペレーションマネージャ２０３によって実施される。非同期オペレーションマネージャは、コンポーネント２０２Ｃから標準関数呼出し２２２を受け取り（動作３０１）、次いで、標準関数呼出しに応答して、標準関数呼出しがアプリケーションフレームワークとは無関係な方法で発行されたとしても、アプリケーションフレームワークにとって適切な方法で非同期オペレーションを実行する機能的結果指向ステップを実行する（ステップ３１０）。このステップは、この結果を達成するための任意の対応する動作を含むことができる。しかし、例示の実施形態では、ステップ２１０は、対応する非機能的動作２１１、２１２、２１３、および２１４を含む。
【００３６】
具体的には、非同期オペレーションマネージャ２０３は、コンポーネント２０２Ｃが組み込まれるアプリケーション２０１Ｄを構築するのに使用されるアプリケーションフレームワーク２０４Ａを検出する（動作３１１）。これは、アプリケーションフレームワーク２０４Ａを識別する通知２２１を受け取ることによって実施することができる。この動作は、非同期オペレーションの実行前または実行中のいつでも行うことができる。
【００３７】
非同期オペレーションマネージャ２０３はさらに、関数呼出しに応答して非同期オペレーションを実行すべきかを判定する（動作３１２）。次いで非同期オペレーションマネージャ２０３は、コンポーネント２０２Ｃが組み込まれるアプリケーションを構築するのに使用されるアプリケーションフレームワーク２０１Ｄに従って非同期オペレーションを実行する（動作３１３）。次いで、非同期コンポーネントは、非同期オペレーションが完了した場合に、スレッド化／同時処理モデルに従う方法で、通知２２３をコンポーネント２０２Ｃに発行する。（動作３１４）言い換えれば、非同期オペレーションは、検出したアプリケーションフレームワークに適したスレッド上に戻る。スレッド化／同時処理モデルに応じて、これは、無制限に任意のスレッド上に戻ること、ユーザインターフェースをレンダリングするのに使用されるのと同一の、またはそれとは異なるスレッド上に戻ること、非同期オペレーションを開始するのに使用されるのと同一のスレッド上に戻ることなどを含むことができる。
【００３８】
本発明の原理を説明したので、次に、非同期オペレーションマネージャ２０３とインターフェースすることができるコンポーネントの一例をコード例に関して説明する。例示的コンポーネントは、非同期オペレーションマネージャ２０３が扱うことができるどんなアプリケーションフレームワークに対しても使用することができるいくつかのメソッドを含む。非同期オペレーションマネージャのコード例も以下でさらに与える。
【００３９】
以下のコンポーネントコード例は、「ＷｈｏｌｅｓａｌｅＧｅｏｄｕｃｋＰｒｉｃｅｒ」という名称であり、コード例で「ＡｓｙｎｃＯｐｅｒａｔｉｏｎＭａｎａｇｅｒ」と呼ばれる非同期オペレーションマネージャ２０３のコンポーネントの使用を示す。太字の要素は、特にＡｓｙｎｃＯｐｅｒａｔｉｏｎＭａｎａｇｅｒに関連する。ここで実装するＣａｌｃｕｌａｔｅＰｒｉｃｅＡｓｙｎｃ（）のバージョンは、「状態」と呼ばれる状態オブジェクトを取ることにまず留意されたい。さらに、「ＷｈｏｌｅｓａｌｅＧｅｏｄｕｃｋＰｒｉｃｅｒ」により、複数の同時オペレーションを未処理とすることが可能となる。ＡｓｙｎｃＯｐｅｒａｔｉｏｎＭａｎａｇｅｒおよび関係するクラスは、コンポーネント作者の観点から直接的に、こうした複数の同時オペレーションの実装の管理を行う。
【００４０】
以下でコンポーネントコード例を、わかりやすいように行番号を付けて提示する。
【００４１】
1.  using  System.ComponentModel;
2.  public  class WholesaleGeoduckPricer:Component
3.  ｛
4.    public  WholesaleGeoduckPricer()
5.    ｛
6.      onCompletedDelegate  =  new  AsyncOperationPostDelegate(CalculateCompleted);
7.    ｝
8.    public  void  CalculatePriceAsync(float  kilos,  object  state)
9.    ｛
10.      AsyncOperation asyncOp  =  AsyricOperationManager.CreateOperation(state);
11.      someMorePrimitiveMethodTakingDelegate(kilos,  asyncOp,  some-delegate-constructed-from-MyCompletionMethod);
12.    ｝
13.    public  event  CalculatePriceCompletedEventHandler  CalculatePriceCompleted;
14.    protected  void  OnCalculatePriceCompleted(CalculatePriceCompletedEventArgs  e)
15.    ｛
16.        if  (CalculatePriceCompleted  !=null)
17.        ｛
18.          CalculatePriceCompleted(this,  e);
19.        ｝
20.    ｝
21.    private  void  MyCompletionMethod(AsyncOperation  asyncOp)
22.    ｛
23.        decimal  price  =  ...;
24.        Exception  exception  =  ...;
25.        bool  cancelled  =  ...;
26.        CalculatePriceCompletedEventArgs  e  =  new  CalculatePriceCompletedEventArgs(price,  exception,  cancelled,  asyncOp.UserSuppliedToken);
27.        asyncOp.OperationCompleted(onCompletedDelegate,  e);
28.    ｝
29.    private  void  CalculateCompleted(AsyncOperation  asyncOp,  object  operationState)
30      ｛
31.        OnCalculatePriceCompleted((CalculatePriceCompletedEventArgs)  operationState);
32.    ｝
33.    private  AsyncOperationPostDelegate  onCompletedDelegate;
34.  ｝
35.  public  class  CalculatePriceCompletedEventArgs  :  AsyncCompletedEventArgs
36.  ｛
37.    public  CalculatePriceCompletedEventArgs(decimal  price,  Exception  e,  bool  cancelled,  object  state):base(e,  cancelled,  state)
38.    ｛
39.        this.price  =  price;
40.    ｝
41.    public  decimal  Price
42.    ｛
43.        get
44.        ｛
45.            RaiseExceptionIfNecessaryO;
46.            return  price;
47.        ｝
48.    ｝
49.  ｝
50.  public  delegate  void  CalculatePriceCompleteEventHandler(object  sender,  CalculatePriceCompleteEventArgs  e);
【００４２】
このコンポーネントは、どんなアプリケーションフレームワークでも動作する。ＡｓｙｎｃＯｐｅｒａｔｉｏｎＭａｎａｇｅｒおよびＡｓｙｎｃＯｐｅｒａｔｉｏｎは、アプリケーションフレームワークがその下に存続し、コンポーネントがその上に存続するアブストラクションポイントを表し、基礎となるインフラストラクチャは、アプリケーションフレームワークに適したオブジェクトが適切な時にインストールされることを保証する。
【００４３】
行２から３４は、Ｍｉｃｒｏｓｏｆｔ  ．ＮＥＴ言語であるＣ＃で書かれたＷｈｏｌｅｓａｌｅＧｅｏｄｕｃｋＰｒｉｃｅｒコンポーネントを定義する。このコード例と、その他のすべてのコード例はＣ＃で書かれる。行２は、コンポーネントのタイトル行であり、コンポーネントをパブリッククラスと定義する。行４から７は、パブリックＷｈｏｌｅｓａｌｅＧｅｏｄｕｃｋＰｒｉｃｅｒコンストラクタを定義する。行６は、完了した場合に非同期オペレーションを返すのに使用されるデリゲートを構築する。
【００４４】
行８から１２は、価格付けを望む所望のＧｅｏｄｕｃｋのキログラム数が入力されるパブリックメソッドＣａｌｃｕｌａｔｅＰｒｉｃｅＡｓｙｎｃを定義する。ユーザ状態もこのメソッドに渡される。このユーザ状態は、ＣａｌｃｕｌａｔｅＰｒｉｃｅＡｓｙｎｃの複数の独立した呼出しを区別するのに使用される。行１０は、ＡｓｙｎｃＯｐｅｒａｔｉｏｎＭａｎａｇｅｒ．ＣｒｅａｔｅＯｐｅｒａｔｉｏｎメソッドを呼び出してこの非同期オペレーションに関する「存続時間」を表すＡｓｙｎｃＯｐｅｒａｔｉｏｎを作成することによって非同期オペレーションを作成するが、まだ開始しない。ユーザ状態がＣｒｅａｔｅＯｐｅｒａｔｉｏｎに渡される。この「存続時間」ＡｓｙｎｃＯｐｅｒａｔｉｏｎは、非同期に動作する基礎となるメカニズムに渡される。このメカニズムはまた、ＡｓｙｎｃｈＯｐｅｒａｔｉｏｎが行われた場合にＭｙＣｏｍｐｌｅｔｉｏｎＭｅｔｈｏｄ（）メソッドを起動するデリゲートも受け取る。最終的に、成功、失敗、または取消しによって、ＭｙＣｏｍｐｌｅｔｉｏｎＭｅｔｈｏｄ（）が任意のスレッド上に起動され、存続時間がそれに渡される。
【００４５】
このＭｙＣｏｍｐｌｅｔｉｏｎＭｅｔｈｏｄは、ＣａｌｃｕｌａｔｅＰｒｉｃｅＣｏｍｐｌｅｔｅｄＥｖｅｎｔＡｒｇｓを構築し、次いでＡｓｙｎｃＯｐｅｒａｔｉｏｎ上のＯｐｅｒａｔｉｏｎＣｏｍｐｌｅｔｅｄを呼び出し、現アプリケーションモデルに対して正しいスレッド／コンテキスト上で実行すべきメソッドのデリゲートを渡す。このメソッドはＣａｌｃｕｌａｔｅＣｏｍｐｌｅｔｅｄ（）である。
【００４６】
ＡｓｙｎｃＯｐｅｒａｔｉｏｎ．ＯｐｅｒａｔｉｏｎＣｏｍｐｌｅｔｅｄ（）関数は２つの事を行う。すなわち、ＡｓｙｎｃＯｐｅｒａｔｉｏｎ．ＯｐｅｒａｔｉｏｎＣｏｍｐｌｅｔｅｄ（）機能は、指定のコールバック関数（デリゲート）が適切なスレッド化／同時処理コンテキストで呼び出されるよう保証し、非同期オペレーションの存続時間を効果的に「終了」させる。ＯｐｅｒａｔｉｏｎＣｏｍｐｌｅｔｅｄを呼び出した後にＡｓｙｎｃＯｐｅｒａｔｉｏｎを使用する試行は例外を発生させる。上記がＣａｌｃｕｌａｔｅＣｏｍｐｌｅｔｅｄ（）となった場合、正しいスレッド／コンテキスト上にあり、そこから自分のイベントを単に発生させることができる。
【００４７】
ＡｓｙｎｃＯｐｅｒａｔｉｏｎがコンポーネント中の単一インスタンスデータとして格納されるのではなく呼出しで搬送されるので、複数の未処理同期オペレーションをここでサポートできることに留意されたい。情報を渡す代替方法は、このコンポーネント上に存続時間の集合を維持し、それを取り出してＯｐｅｒａｔｉｏｎＣｏｍｐｌｅｔｅｄ（）を呼び出し、その直後に集合からそれを除去することである。
【００４８】
これらは設計を駆使し、それによってコンポーネントがスタティックメソッドＡｓｙｎｃＯｐｅｒａｔｉｏｎＭａｎａｇｅｒ．ＣｒｅａｔｅＯｐｅｒａｔｉｏｎ（）に、そのための新しいＡｓｙｎｃＯｐｅｒａｔｉｏｎを作成するよう依頼し、通信のために必要なメソッドがそのオブジェクトをハングオフする。一方、ＣｒｅａｔｅＯｐｅｒａｔｉｏｎ（）は、登録したファクトリを通じて呼び出すことによってそのオブジェクトを作成する。登録したファクトリの仕事は、そのスレッドの現ａｐｐモデルに関する新しい「存続時間」を作成することである。
【００４９】
以下に、非同期オペレーションマネージャ２０３にとってパブリックに使用可能なインターフェース（メソッドおよびプロパティ）を示す。わかりやすいように、以下のように行番号を付けてある。
【００５０】
1.  namespace  System.ComponentModel
2.  ｛
3.    public  class  AsyncOperationManager
4.    ｛
5.        static  AsyncOperation  Create0peration(object  userSuppliedToken);
6.        static  AsyncOperationFactory  CurrentFactory
7.        ｛
8.            get;
9.            set;
10.        ｝
11.        static  AsyncOperationFactory  FreeThreadedFactory
12.        ｛
13.            get;
14.        ｝
15.    ｝
16.  ｝
【００５１】
メソッドＣｒｅａｔｅＯｐｅｒａｔｉｏｎは以下のように定義される。
.  static  AsyncOperation  CreateOperation(object  userSuppliedToken);
【００５２】
メソッドＣｕｒｒｅｎｔＦａｃｔｏｒｙは以下のように定義される。
1.  static  AsyncOperationFactory  CurrentFactory
2.  ｛
3.      get;
4.      set;
5.  ｝
【００５３】
ｇｅｔメソッドおよびｓｅｔメソッドは、スレッドに関する現ＡｓｙｎｃＯｐｅｒａｔｉｏｎＦａｃｔｏｒｙに影響を及ぼす。このファクトリは、実際のＡｓｙｎｃＯｐｅｒａｔｉｏｎを作成するのに使用される。アプリケーションフレームワークプロバイダだけがこれらのメソッドを呼び出す。
【００５４】
ＦｒｅｅＴｈｒｅａｄｅｄＦａｃｔｏｒｙメソッドを以下で定義する。ＦｒｅｅＴｈｒｅａｄｅｄＦａｃｔｏｒｙメソッドは、常に別々のスレッド上で動作するＡｓｙｎｃＯｐｅｒａｔｉｏｎｓを作成するファクトリである。
【００５５】
1.  static  AsyncOperationFactory  FreeThreadedFactory
2.  ｛
3.      get;
4.  ｝
【００５６】
このメソッドは、フリースレッド化非同期オペレーション存続時間を作成するファクトリにアクセスする。
【００５７】
以下は、上記のコード例で参照されるＡｓｙｎｃＯｐｅｒａｔｉｏｎに関するクラス定義である（わかりやすいように行番号を付けてある）。
【００５８】
1.  public  abstract  class  AsyncOperation
2.  ｛
3.      public  AsyncOperation(object  userSuppliedToken);
4.      public  object  UserSuppliedToken  ｛  get;  ｝
5.      public  void  OperationCompleted(AsyncOperationPostDelegate  d,  object  arg);
6.      public  void  Post(AsyncOperationPostDelegate  d,  object  arg);
7.      protected  abstract  void  OperationCompletedCore(AsyncOperationPostDelegate  d,  object  arg);
8.      protected  abstract  void  Post(AsyncOperationPostDelegate  d,  object  arg);
9.  ｝
【００５９】
以下のＶＢ．ＮＥＴコードは、このパターンの「使用法」を実演している。第１行は、新しいＷｈｏｌｅｓａｌｅＧｅｏｄｕｃｋＰｒｉｃｅｒコンポーネントを構築する。第２行は、ＣａｌｃｕｌａｔｅＰｒｉｃｅオペレーションを開始し、ＣａｌｃｕｌａｔｅＰｒｉｃｅＡｓｙｎｃを呼び出す。ＣａｌｃｕｌａｔｅＰｒｉｃｅＡｓｙｎｃが非同期に進行中であるからである。最後に、最後の関数は、価格付けオペレーションが完了した場合にこの関数を関数の結果と共に起動する「完了ハンドラ」である。この完了関数は非同期に呼び出され、アプリケーションが実行中の正しいスレッド／コンテキスト上で呼び出される（わかりやすいように行番号を付けてある）。
【００６０】
1.  WithEvents  MyPricer  as  New  WholesaleGeoduckPricer
2.  MyPricer.CalculatePriceAsync(3.4,  Nothing)
3.  Sub  Pricer_CalculatePriceCompleted(ByVal  Sender  as  Object,  ByVal  e  as  CalculatePriceEventArgs)
4.      Handles  MyPricer.CalculatePriceCompleted
5.      MessageBox.Show("Price  is  "  +  e.Price);
6.  End  Sub
【００６１】
したがって、コンポーネントが組み込まれるアプリケーションを構築するのに使用される基礎となるアプリケーションフレームワークとは無関係の方法で、コンポーネントを組み込むことができるプログラミングモデルを説明した。したがって、本発明の原理により、コンポーネント作者はコンポーネント自体の中の潜在的な基礎となるアプリケーションフレームワークスレッド化／同時処理モデルに明示的に対処する必要がないので、非同期オペレーションを実施するコンポーネントを構築する場合にソフトウェアのより効率的な進歩が可能となる。
【００６２】
本発明は、その精神または不可欠な特徴から逸脱することなく他の特定の形態で実施することもできる。記載の実施形態はすべてに関して単に例示的なものとみなすべきであり、限定的なものとみなすべきではない。したがって、本発明の範囲は、上記の説明ではなく、特許請求の範囲によって示される。特許請求の範囲の均等の意味および範囲内のすべての変更は、その範囲内に包含されるとみなすべきである。
【図面の簡単な説明】
【００６３】
【図１】本発明の機能を実施することができる適切なコンピューティングシステムを示す図である。
【図２】アプリケーションフレームワークに従って構築されたアプリケーションに組み込まれるコンポーネントから関数呼出しを受け取ることによって非同期オペレーションを実施することができ、複数のフレームワークと通信することができる非同期オペレーションマネージャを示す図である。
【図３】非同期オペレーションマネージャが本発明の原理に従って非同期オペレーションを実施する方法を示す図である。
【符号の説明】
【００６４】
１２１  処理装置
１２２  システムメモリ
１２３  システムバス
１２４  読取り専用メモリ（ＲＯＭ）
１２５  ランダムアクセスメモリ（ＲＡＭ）
１２６  基本入出力システム（ＢＩＯＳ）
１２７  ハードディスクドライブ
１２８  磁気ディスクドライブ
１２９  取外し可能磁気ディスク
１３０  光ディスクドライブ
１３１  取外し可能光ディスク
１３２  ハードディスクドライブインターフェース
１３３  磁気ディスクドライブインターフェース
１３４  光ディスクドライブインターフェース
１３５  オペレーティングシステム
１３６  アプリケーションプログラム
１３７  他のプログラムモジュール
１３８  プログラムデータ
１３９  磁気ハードディスク
１４０  キーボード
１４２  ポインティングデバイス
１４６  シリアルポートインターフェース
１４７  モニタ
１４８  ビデオアダプタ
１４９ａ、１４９ｂ  リモートコンピュータ
１５０ａ、１５０ｂ  メモリ記憶装置
１５１  ローカルエリアネットワーク（ＬＡＮ）
１５２  広域ネットワーク（ＷＡＮ）
１５３  ネットワークインターフェース／アダプタ
１５４  モデム
２００  階層
２０１  アプリケーション
２０２  コンポーネント
２０３  非同期オペレーションマネージャ
２０３Ａ、２０３Ｂ  標準インターフェース
２０４  アプリケーションフレームワーク
【図１】
0004627636.tif 000002
【図２】
0004627636.tif 000003
【図３】
0004627636.tif 000004