Objets agiles en C#/WinRT

La plupart des classes Windows Runtime sont agiles, ce qui signifie qu’elles sont accessibles à partir de n’importe quel thread sur différents cloisonnements. Les types C#/WinRT que vous créez sont agiles par défaut et il n’est pas possible de désactiver ce comportement pour ces types.

Toutefois, les types C#/WinRT projetés (qui incluent les types Windows Runtime fournis par le SDK Windows et la bibliothèque WinUI) ne sont pas toujours agiles. Par exemple, de nombreux types qui représentent des objets d’interface utilisateur ne sont pas agiles. Lorsque vous consommez des types non agiles, vous devez tenir compte de leur modèle de thread et de leur comportement de marshaling. C#/WinRT fournit la prise en charge des références agiles si vous devez marshaler un objet non agile sur plusieurs cloisonnements de façon sécurisée.

Note

Le Windows Runtime est basé sur COM. En termes de COM, une classe agile est inscrite avec ThreadingModel = Both. Pour plus d’informations sur les modèles de thread COM, voir Présentation et utilisation des modèles de thread COM.

Vérifier la prise en charge des objets agiles

Pour vérifier si un objet Windows Runtime est agile, utilisez le code suivant qui permet de déterminer si l’objet prend en charge l’interface IAgileObject.

var queryAgileObject = testObject.As<IAgileObject>();

if (queryAgileObject != null) {
    // testObject is agile.
}

Créer une référence agile

Pour créer une référence agile pour un objet non agile, vous pouvez utiliser la méthode d’extension AsAgile. AsAgile est une méthode d’extension générique qui peut être appliquée à n’importe quel type C#/WinRT projeté. Si le type n’est pas un type projeté, une exception est levée. Voici un exemple d’utilisation d’un objet PopupMenu, qui est un type non agile fourni dans le SDK Windows.

var nonAgileObj = new Windows.UI.Popups.PopupMenu();
AgileReference<Windows.UI.Popups.PopupMenu> agileReference = nonAgileObj.AsAgile();

Vous pouvez maintenant passer agileReference à un thread dans un cloisonnement différent et l’utiliser à cet endroit.

await Task.Run(() => {
        Windows.UI.Popups.PopupMenu nonAgileObjAgain = agileReference.Get();
    });