マネージド ライブラリのスレッド処理に関する考慮事項
次のタブレット PC スレッドに関する考慮事項は、マネージド ライブラリに固有です。
- スレッド セーフ
- STA および MTA アプリケーション
- Windows フォーム スレッドに関する考慮事項
- クリップボードに関する考慮事項
- イベント ハンドラー内の例外
- オブジェクトとコントロールの破棄
- StylusInput API
Thread-Safety
タブレット PC プラットフォームのマネージド ライブラリ クラスは、通常、スレッド セーフではありません。 次のコレクションは、メンバー レベルでスレッド セーフです。ただし、これらのコレクションは、別のスレッドがコレクションで同時に動作する場合に列挙子が保護されることを保証しません。
STA および MTA アプリケーション
Microsoft Visual Studio .NET に含まれるウィザードを使用して作成されたマネージド アプリケーションは、既定ではシングルスレッド アパートメント (STA) です。 アプリケーションのエントリ ポイントで STA スレッドまたはマルチスレッド アパートメント (MTA) スレッド属性を設定することで、アプリケーションのアパートメントを変更できます。
アプリケーションが MTA で実行されている場合は、スレッド セーフなコードを記述する必要があります。ただし、そうすることで、特定のイベント処理のパフォーマンスの問題を改善できます。
STA スレッドと MTA スレッド属性の詳細については、「 STAThreadAttribute クラス」および「 MTAThreadAttribute クラス」を参照してください。
Windows フォーム スレッドに関する考慮事項
InkPicture コントロールと InkEdit コントロールは、Windows フォームコントロールを拡張します。 Windows フォームは本質的にシングル スレッドのネイティブ Win32 ウィンドウに基づいているため、Windows フォーム コントロールはシングル スレッド アパートメント (STA) モデルを使用します。 マネージ コードでは、フォームのメイン スレッドと同じスレッドにインク コントロールを作成する必要があります。
STA アプリケーションでは、アプリケーションのユーザー インターフェイス (UI) スレッド以外のスレッドで特定のイベントが発生します。 Tablet PC イベント ハンドラー内から InkPicture コントロールや InkEdit コントロールなど、Windows フォームオブジェクトまたはコントロールを呼び出す場合は、オブジェクトまたはコントロールの継承された Control.Invoke メソッドを使用します。 Control クラスから継承された InvokeRequired プロパティを使用して、これが必要かどうかを判断できます。
たとえば、 Recognition イベントの次のイベント ハンドラーでは 、InvokeRequired プロパティがテストされ、 TRUE の場合は、ユーザー インターフェイス スレッドからイベント ハンドラーが再呼び出されます。
void recoContext_Recognition(object sender,
RecognizerContextRecognitionEventArgs e)
{
if (InvokeRequired)
{
Invoke( new RecognizerContextRecognitionEventHandler(
recoContext_Recognition ),
new object[] { sender, e } );
return;
}
// Use the recognition result here.
}
UserControl をブラウザーの awebpage に配置すると (Web コントロールを参照)、STA アプリケーションとして実行されます。 スマート クライアント アプリケーションの場合 (「 タッチ展開なし」を参照)、開発者は ApartmentState を完全に制御できます。 (既定値は一般に STA ですが、CLR のバージョンによっては MTA である場合があります)。 RealTimeStylus に関連するスレッドの問題については、「 StylusInput API のスレッド処理に関する考慮事項」を参照してください。
MTA アプリケーションからWindows フォームを呼び出す方法の詳細については、「マルチスレッド Windows フォーム コントロールサンプル」を参照してください。
クリップボードに関する考慮事項
Clipboard オブジェクトは STA スレッドからのみ機能します。 STA ではないスレッドからクリップボードにコピーまたは貼り付けようとすると、 ThreadStateException が取得されます。 アプリケーションが MTA の場合は、STA スレッドを作成して、クリップボードのメソッド呼び出しと、アプリケーションのその他の UI の一部を処理します。
イベント ハンドラー内の例外
Tablet PC イベント ハンドラー内から例外をスローすることはできません。 たとえば、Tablet PC オブジェクトまたはコレクションのイベント ハンドラー デリゲートに 3 つの登録済みハンドラーがあり、最初のハンドラーが例外をスローした場合、次のシーケンスが発生します。
- 最初のハンドラーが終了します。
- 例外は失われます。
- 残りのハンドラーは呼び出されません。
オブジェクトとコントロールの破棄
メモリ リークを回避するには、オブジェクトまたはコントロールがスコープ外になる前に、イベント ハンドラーがアタッチされている Tablet PC オブジェクトまたはコントロールで Dispose メソッドを明示的に呼び出す必要があります。
アプリケーションのパフォーマンスを向上させるには、オブジェクトまたはコントロールが不要になったときに Dispose メソッドを実装する Tablet PC オブジェクトまたはコントロールを手動で 破棄 します。
StylusInput API
RealTimeStylus オブジェクトと StylusInput アプリケーション プログラミング インターフェイス (API) のスレッドに関する考慮事項については、「StylusInput API のスレッド処理に関する考慮事項」を参照してください。