次の方法で共有


C#/WinRT におけるアジャイル オブジェクト

ほとんどの 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()
    });