Leggere in inglese

Condividi tramite


Oggetti Agile in C#/WinRT

La maggior parte delle classi di Windows Runtime sono agile, quindi è possibile accedervi da qualsiasi thread in diversi apartment. I tipi C#/WinRT creati sono agile per impostazione predefinita e non è possibile annullare questo comportamento per tali tipi.

Tuttavia, i tipi C#/WinRT previsti (che includono i tipi di Windows Runtime forniti da Windows SDK e dalla libreria WinUI) potrebbero essere o non essere agile. Ad esempio, molti tipi che rappresentano oggetti dell'interfaccia utente non sono agili. Quando vengono consumati tipi non-agile, è necessario prendere in considerazione il modello di threading e il comportamento del marshaling. C#/WinRT fornisce supporto per riferimenti agile se si necessita di effettuare il marshalling di un oggetto non-agile in più apartment in modo sicuro.

Nota

Windows Runtime è basato su COM. In base a COM, una classe Agile viene registrata con ThreadingModel = Both. Per altre informazioni sui modelli di threading COM, vedi Informazioni e uso dei modelli di threading COM.

Supporto verifica agile

Per verificare se un oggetto di Windows Runtime è agile, usare il codice seguente per determinare se l'oggetto supporta l'interfaccia IAgileObject.

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

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

Creare un riferimento agile

Per creare un riferimento agile per un oggetto non-agile, è possibile usare il metodo di estensione AsAgile. AsAgile è un metodo di estensione generico che può essere applicato a qualsiasi tipo C#/WinRT previsto. Se il tipo non è un tipo previsto, viene restituita un'eccezione. Segue un esempio che usa un oggetto PopupMenu, che è un topo non-agile di Windows SDK.

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

Ora è possibile passare agileReference a un thread in un apartment diverso e usarlo lì.

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