ほとんどの Windows ランタイム クラスは "アジャイル" です。つまり、さまざまなアパートメント間の任意のスレッドからアクセスできます。 作成した C#/WinRT 型は既定でアジャイルであるため、これらの型に対してこの動作を無効にすることはできません。
ただし、投影された C#/WinRT 型 (Windows SDK と WinUI ライブラリによって提供される Windows ランタイムの型を含む) は、アジャイルである場合もあれば、そうでない場合もあります。 たとえば、UI オブジェクトを表す多くの型はアジャイルではありません。 非アジャイル型を使用する場合は、そのスレッド モデルとマーシャリング動作を考慮に入れる必要があります。 C#/WinRT では、非アジャイル オブジェクトをアパートメント間で安全な方法でマーシャリングする必要がある場合に、アジャイル参照がサポートされます。
注意
Windows ランタイム は COM に基づいています。 COM の用語では、アジャイル クラスは ThreadingModel
= Both に登録されています。 COM スレッド モデルとアパートメントの詳細については、「COM スレッド モデルの理解と使用」をご覧ください。
アジャイル サポートを確認する
Windows ランタイム オブジェクトがアジャイルであるかどうかを確認するには、次のコードを使用して、オブジェクトが IAgileObject インターフェイスをサポートしているかどうかを確認します。
var queryAgileObject = testObject.As<IAgileObject>();
if (queryAgileObject != null) {
// testObject is agile.
}
アジャイル参照を作成する
非アジャイル オブジェクトのアジャイル参照を作成するには、AsAgile
拡張メソッドを使用できます。 AsAgile
は、投影された任意の C#/WinRT 型に適用できる汎用的な拡張メソッドです。 投影型でない型の場合は、例外がスローされます。 Windows SDK の非アジャイル型である PopupMenu オブジェクトの使用例を次に示します。
var nonAgileObj = new Windows.UI.Popups.PopupMenu();
AgileReference<Windows.UI.Popups.PopupMenu> agileReference = nonAgileObj.AsAgile();
これで、別のアパートメントのスレッドに agileReference
を渡して、そこで使用できるようになりました。
await Task.Run(() => {
Windows.UI.Popups.PopupMenu nonAgileObjAgain = agileReference.Get()
});
Windows developer