Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sebagian besar kelas Windows Runtime lincah, yang berarti mereka dapat diakses dari utas apa pun di berbagai apartemen. Jenis C#/WinRT yang Anda buat gesit secara default, dan tidak dimungkinkan untuk menolak perilaku ini untuk jenis tersebut.
Namun, jenis C#/WinRT yang diproyeksikan (yang mencakup jenis Windows Runtime yang disediakan oleh Windows SDK dan pustaka WinUI) mungkin atau mungkin tidak gesit. Misalnya, banyak jenis yang mewakili objek UI tidak tangkas. Ketika Anda mengonsumsi jenis non-agile, Anda perlu mempertimbangkan model utas dan perilaku marshaling mereka. C#/WinRT menyediakan dukungan untuk referensi yang gesit jika Anda perlu melakukan marshal objek non-tangkas di seluruh apartemen dengan cara yang aman.
Catatan
Windows Runtime didasarkan pada COM. Dalam istilah COM, kelas tangkas terdaftar di ThreadingModel = Keduanya. Untuk informasi selengkapnya tentang model utas COM, dan apartemen, lihat Memahami dan Menggunakan Model Threading COM.
Periksa dukungan tangkas
Untuk memeriksa apakah objek Windows Runtime gesit , gunakan kode berikut untuk menentukan apakah objek mendukung antarmuka IAgileObject .
var queryAgileObject = testObject.As<IAgileObject>();
if (queryAgileObject != null) {
// testObject is agile.
}
Membuat referensi tangkas
Untuk membuat referensi tangkas untuk objek non-tangkas, Anda dapat menggunakan AsAgile metode ekstensi. AsAgile adalah metode ekstensi generik yang dapat diterapkan ke jenis C#/WinRT yang diproyeksikan. Jika jenisnya bukan jenis yang diproyeksikan, pengecualian akan dilemparkan. Berikut adalah contoh menggunakan objek PopupMenu , yang merupakan jenis non-agile dari Windows SDK.
var nonAgileObj = new Windows.UI.Popups.PopupMenu();
AgileReference<Windows.UI.Popups.PopupMenu> agileReference = nonAgileObj.AsAgile();
Anda sekarang dapat meneruskan agileReference ke utas di apartemen yang berbeda, dan menggunakannya di sana.
await Task.Run(() => {
Windows.UI.Popups.PopupMenu nonAgileObjAgain = agileReference.Get()
});
Windows developer