Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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();
});