Compartir a través de


Objetos ágiles en C#/WinRT

La mayoría de las clases de Windows Runtime son ágiles, lo que significa que se puede acceder a ellas desde cualquier subproceso en diferentes departamentos. Los tipos de C#/WinRT que cree son ágiles de forma predeterminada y no es posible rechazar este comportamiento para esos tipos.

Sin embargo, los tipos C#/WinRT proyectados (que incluyen los tipos de Windows Runtime que proporcionan el SDK de Windows y la biblioteca WinUI) pueden ser o no ágiles. Por ejemplo, muchos tipos que representan objetos de interfaz de usuario no son ágiles. Cuando se consumen tipos no ágiles, debe tener en cuenta su modelo de subprocesamiento y su comportamiento de serialización. C#/WinRT proporciona compatibilidad con referencias ágiles si necesita serializar un objeto no ágil en los departamentos de una manera segura.

Nota

Windows Runtime se basa en COM. En términos COM, una clase ágil se registra con ThreadingModel = both. Para más información sobre los modelos de subprocesos COM y los apartamentos, consulta Descripción y uso de los modelos de subprocesos COM.

Comprobación de la compatibilidad con elementos ágiles

Para comprobar si un objeto de Windows Runtime es ágil, utilice el siguiente código para determinar si el objeto es compatible con la interfaz IAgileObject.

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

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

Creación de una referencia ágil

Para crear una referencia ágil para un objeto no ágil, puede usar el método de extensión AsAgile. AsAgile es un método de extensión genérico que se puede aplicar a cualquier tipo C#/WinRT proyectado. Si el tipo no es un tipo proyectado, se produce una excepción. Este es un ejemplo de uso de un objeto PopupMenu, que es un tipo no ágil de Windows SDK.

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

Ahora puede pasar agileReference a un subproceso en un apartamento diferente y usarlo allí.

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