Membuat Aplikasi Windows Universal multi-instans

Topik ini menjelaskan cara membuat aplikasi Platform Windows Universal multi-instans (UWP).

Dari Windows 10, versi 1803 (10.0; Build 17134) dan seterusnya, aplikasi UWP Anda dapat ikut serta untuk mendukung beberapa instans. 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, berjalan dalam proses terpisah.

Penting

Multi-instancing didukung untuk aplikasi JavaScript, tetapi pengalihan multi-instancing tidak. Karena pengalihan multi-instancing tidak didukung untuk aplikasi JavaScript, kelas AppInstance tidak berguna untuk aplikasi tersebut.

Ikut serta dalam perilaku multi-instans

Jika Anda membuat aplikasi multi-instans baru, Anda dapat menginstal Templat Proyek Aplikasi Multi-Instans.VSIX, yang tersedia dari Visual Studio Marketplace. Setelah Anda menginstal templat, templat tersebut akan tersedia dalam dialog Proyek Baru di bawah Visual C# > Windows Universal (atau Bahasa > Lain Visual C++ > Windows Universal).

Catatan

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 ini mencegah build menghasilkan Main(). 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 ditambahkan SupportsMultipleInstances ke package.appxmanifest file. Perhatikan awalan desktop4 namespace layanan dan iot2: hanya proyek yang menargetkan desktop, atau proyek Internet of Things (IoT), yang mendukung multi-instancing.

<Package
  ...
  xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4"
  xmlns:iot2="http://schemas.microsoft.com/appx/manifest/iot/windows10/2"  
  IgnorableNamespaces="uap mp desktop4 iot2">
  ...
  <Applications>
    <Application Id="App"
      ...
      desktop4:SupportsMultipleInstances="true"
      iot2:SupportsMultipleInstances="true">
      ...
    </Application>
  </Applications>
   ...
</Package>

Pengalihan aktivasi multi-instans

Dukungan multi-instancing untuk aplikasi UWP melampaui hanya memungkinkan untuk meluncurkan 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 SupportsMultipleInstances ditambahkan ke file package.appxmanifest seperti yang ditunjukkan di atas, dan juga menambahkan Program.cs (atau Program.cpp, jika Anda menggunakan versi C++ templat) ke proyek Anda yang berisi Main() fungsi. Logika untuk mengalihkan aktivasi berjalan dalam Main fungsi . 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 berjalan. 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 mungkin 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 di luar proc 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). Namun demikian, instans tugas latar belakang yang berbeda dibuat.
  • Tugas latar belakang dalam proc tidak mendukung multi-instancing.
  • Tugas audio latar belakang tidak mendukung multi-instancing.
  • 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 berdasarkan per instans. Ini akan mengakibatkan beberapa pendaftaran untuk pemicu yang sama, dan beberapa instans tugas latar belakang akan diaktifkan saat pemicu diaktifkan.
  • App-services meluncurkan instans terpisah dari tugas latar belakang app-service untuk setiap koneksi. Ini tetap tidak berubah untuk aplikasi multi-instans, yaitu setiap instans aplikasi multi-instans akan mendapatkan instans sendiri dari tugas latar belakang layanan aplikasi.

Pertimbangan tambahan

  • Multi-instancing didukung oleh aplikasi UWP yang menargetkan proyek desktop dan Internet of Things (IoT).
  • 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, semaphores, peristiwa, dan sebagainya, tersedia.
  • Jika aplikasi memiliki SupportsMultipleInstances dalam file Package.appxmanifest- maka ekstensinya tidak perlu mendeklarasikan SupportsMultipleInstances.
  • Jika Anda menambahkan SupportsMultipleInstances ke ekstensi lain, selain tugas latar belakang atau layanan aplikasi, dan aplikasi yang menghosting ekstensi tidak juga mendeklarasikan SupportsMultipleInstances dalam file Package.appxmanifest-nya, maka kesalahan skema dihasilkan.
  • Aplikasi dapat menggunakan deklarasi ResourceGroup dalam manifesnya untuk mengelompokkan beberapa tugas latar belakang ke dalam host yang sama. Ini bertentangan dengan multi-instancing, di mana setiap aktivasi masuk ke host terpisah. Oleh karena itu, aplikasi tidak dapat mendeklarasikan keduanya SupportsMultipleInstances dan ResourceGroup dalam manifesnya.

Sampel

Lihat Sampel multi-Instans untuk contoh pengalihan aktivasi multi-instans.

Lihat juga

AppInstance.FindOrRegisterInstanceForKeyAppInstance.GetActivatedEventArgsAppInstance.RedirectActivationUntukMenangani aktivasi aplikasi