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.
Topik ini menjelaskan cara membuat aplikasi Universal Windows Platform (UWP) multi-instans.
Mulai dari Windows 10, versi 1803 (10.0; Build 17134) dan seterusnya, aplikasi UWP Anda dapat memilih untuk mendukung beberapa instance. Jika instans aplikasi UWP multi-instans berjalan, dan permintaan aktivasi berikutnya datang, platform tidak akan mengaktifkan instans yang ada. Sebaliknya, ini akan membuat instans baru yang beroperasi dalam proses yang terpisah.
Ikut serta dalam perilaku multi-instans
Jika Anda membuat aplikasi multi-instans baru, Anda dapat menginstal Multi-Instance App Project Templates.VSIX, tersedia dari Visual Studio Marketplace. Setelah Anda menginstal templat, templat akan tersedia dalam dialog Proyek Baru
Nota
Templat Proyek Aplikasi Multi-Instans tidak lagi tersedia. Templat VSIX adalah kenyamanan, jadi Anda harus memodifikasi proyek yang ada sebagai gantinya, seperti yang dijelaskan di bawah ini. Pastikan untuk menambahkan konstanta DISABLE_XAML_GENERATED_MAIN ke simbol build proyek, karena hal ini mencegah build menghasilkan fungsi Main() secara default. Ini memungkinkan penggunaan versi Main() khusus aplikasi yang ditulis secara khusus.
Dua templat diinstal: aplikasi UWP Multi-Instans, yang menyediakan templat untuk membuat aplikasi multi-instans, dan aplikasi UWP Pengalihan Multi-Instans, yang menyediakan logika tambahan yang dapat Anda bangun untuk meluncurkan instans baru atau secara selektif mengaktifkan instans yang telah diluncurkan. Misalnya, mungkin Anda hanya ingin satu instans pada satu waktu mengedit dokumen yang sama, sehingga Anda membawa instans yang membuka file tersebut ke latar depan daripada meluncurkan instans baru.
Kedua templat menambahkan SupportsMultipleInstances ke file package.appxmanifest. Perhatikan prefiks namespace desktop4: hanya proyek yang menargetkan desktop yang mendukung multi-instancing.
Nota
Jika aplikasi Anda menargetkan Windows 10, versi 2004 (Build 19041) atau yang lebih baru, Anda dapat menggunakan atribut yang lebih uap10:SupportsMultipleInstances baru alih-alih desktop4:SupportsMultipleInstances. Namespace uap10 adalah pendekatan yang lebih disukai untuk aplikasi yang lebih baru.
<Package
...
xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4"
IgnorableNamespaces="uap mp desktop4">
...
<Applications>
<Application Id="App"
...
desktop4:SupportsMultipleInstances="true">
...
</Application>
</Applications>
...
</Package>
Pengalihan aktivasi multi-instans
Dukungan multi-instancing untuk aplikasi UWP tidak hanya sebatas memungkinkan peluncuran beberapa instans aplikasi. Ini memungkinkan penyesuaian dalam kasus di mana Anda ingin memilih apakah instans baru aplikasi Anda diluncurkan atau instans yang sudah berjalan diaktifkan. Misalnya, jika aplikasi diluncurkan untuk mengedit file yang sudah diedit dalam instans lain, Anda mungkin ingin mengalihkan aktivasi ke instans tersebut alih-alih membuka instans lain yang sudah mengedit file.
Untuk melihatnya beraksi, tonton video ini tentang Membuat aplikasi UWP multi-instans.
Templat aplikasi UWP Pengalihan Multi-Instans Main. Templat untuk Program.cs ditunjukkan di bawah ini.
Properti AppInstance.RecommendedInstance mewakili instans pilihan yang disediakan shell untuk permintaan aktivasi ini, jika ada satu (atau null jika tidak ada). Jika shell memberikan preferensi, maka Anda dapat mengalihkan aktivasi ke instans tersebut, atau Anda dapat mengabaikannya jika Anda memilih.
public static class Program
{
// This example code shows how you could implement the required Main method to
// support multi-instance redirection. The minimum requirement is to call
// Application.Start with a new App object. Beyond that, you may delete the
// rest of the example code and replace it with your custom code if you wish.
static void Main(string[] args)
{
// First, we'll get our activation event args, which are typically richer
// than the incoming command-line args. We can use these in our app-defined
// logic for generating the key for this instance.
IActivatedEventArgs activatedArgs = AppInstance.GetActivatedEventArgs();
// If the Windows shell indicates a recommended instance, then
// the app can choose to redirect this activation to that instance instead.
if (AppInstance.RecommendedInstance != null)
{
AppInstance.RecommendedInstance.RedirectActivationTo();
}
else
{
// Define a key for this instance, based on some app-specific logic.
// If the key is always unique, then the app will never redirect.
// If the key is always non-unique, then the app will always redirect
// to the first instance. In practice, the app should produce a key
// that is sometimes unique and sometimes not, depending on its own needs.
string key = Guid.NewGuid().ToString(); // always unique.
//string key = "Some-App-Defined-Key"; // never unique.
var instance = AppInstance.FindOrRegisterInstanceForKey(key);
if (instance.IsCurrentInstance)
{
// If we successfully registered this instance, we can now just
// go ahead and do normal XAML initialization.
global::Windows.UI.Xaml.Application.Start((p) => new App());
}
else
{
// Some other instance has registered for this key, so we'll
// redirect this activation to that instance instead.
instance.RedirectActivationTo();
}
}
}
}
Main() adalah hal pertama yang dieksekusi. Ini berjalan sebelum OnLaunched dan OnActivated. Ini memungkinkan Anda menentukan apakah akan mengaktifkan ini, atau instans lain, sebelum kode inisialisasi lainnya di aplikasi Anda berjalan.
Kode di atas menentukan apakah instans aplikasi Anda yang sudah ada atau baru diaktifkan. Kunci digunakan untuk menentukan apakah ada instans yang ingin Anda aktifkan. Misalnya, jika aplikasi Anda dapat diluncurkan ke Menangani aktivasi file, Anda dapat menggunakan nama file sebagai kunci. Kemudian Anda dapat memeriksa apakah instans aplikasi Anda sudah terdaftar dengan kunci tersebut dan mengaktifkannya alih-alih membuka instans baru. Ini adalah ide di balik kode: var instance = AppInstance.FindOrRegisterInstanceForKey(key);
Jika instans yang terdaftar dengan kunci ditemukan, maka instans tersebut diaktifkan. Jika kunci tidak ditemukan, maka instans saat ini (instans yang saat ini berjalan Main) membuat objek aplikasinya dan mulai berjalan.
Tugas latar belakang dan multi-instancing
- Tugas latar belakang proses di luar mendukung multi-instancing. Biasanya, setiap pemicu baru menghasilkan instans baru tugas latar belakang (meskipun secara teknis berbicara beberapa tugas latar belakang dapat berjalan dalam proses host yang sama). Meskipun demikian, sebentuk tugas latar belakang yang berbeda dibuat.
- Tugas latar belakang dalam proc tidak mendukung multi-instancing.
- Tugas audio latar belakang tidak mendukung beberapa instance yang berjalan secara bersamaan.
- Ketika aplikasi mendaftarkan tugas latar belakang, biasanya pertama-tama memeriksa untuk melihat apakah tugas sudah terdaftar dan kemudian menghapus dan mendaftarkannya kembali, atau tidak melakukan apa pun untuk menyimpan pendaftaran yang ada. Ini masih merupakan perilaku umum dengan aplikasi multi-instans. Namun, aplikasi multi-instancing dapat memilih untuk mendaftarkan nama tugas latar belakang yang berbeda untuk setiap instance. Ini akan mengakibatkan beberapa pendaftaran untuk pemicu yang sama, dan beberapa instans tugas latar belakang akan diaktifkan saat pemicu diaktifkan.
- Layanan aplikasi meluncurkan instans terpisah dari tugas latar belakang layanan aplikasi untuk setiap koneksi. Ini tetap tidak berubah untuk aplikasi multi-instans, karena itu, setiap instans dari aplikasi multi-instans akan mendapatkan instansnya sendiri dari tugas layanan aplikasi di latar belakang.
Pertimbangan tambahan
- Multi-instancing didukung oleh aplikasi UWP yang menargetkan proyek desktop.
- Untuk menghindari masalah kondisi ras dan ketidakcocokan, aplikasi multi-instans perlu mengambil langkah-langkah untuk mempartisi/menyinkronkan akses ke pengaturan, penyimpanan lokal aplikasi, dan sumber daya lainnya (seperti file pengguna, penyimpanan data, dan sebagainya) yang dapat dibagikan di antara beberapa instans. Mekanisme sinkronisasi standar seperti mutex, semaphore, event, dan sebagainya, tersedia.
- Jika aplikasi memiliki
SupportsMultipleInstancesdalam file Package.appxmanifest, sehingga ekstensinya tidak perlu mendeklarasikanSupportsMultipleInstances. - Jika Anda menambahkan
SupportsMultipleInstanceske ekstensi lain, selain tugas latar belakang atau layanan aplikasi, dan aplikasi yang menghosting ekstensi tidak juga mendeklarasikanSupportsMultipleInstancesdalam file Package.appxmanifest-nya, maka kesalahan skema dihasilkan. - Aplikasi dapat menggunakan deklarasi
ResourceGroup dalam manifesnya untuk mengelompokkan beberapa tugas latar belakang ke host yang sama. Ini bertentangan dengan multi-instancing, di mana setiap aktivasi berjalan di host terpisah. Oleh karena itu, aplikasi tidak dapat mendeklarasikan SupportsMultipleInstancesdanResourceGroupdalam manifesnya.
Contoh
Lihat sampel Multi-Instans untuk contoh pengalihan aktivasi multi-instans.
Lihat juga
AppInstance.FindOrRegisterInstanceForKeyAppInstance.GetActivatedEventArgsAppInstance.RedirectActivationToMenangani aktivasi aplikasi