Sdílet prostřednictvím


Vytvoření univerzální aplikace pro Windows s více instancemi

Toto téma popisuje, jak vytvářet aplikace pro univerzální platformu Windows (UPW) s více instancemi.

Od Windows 10 verze 1803 (10.0; Build 17134) a novější může vaše aplikace pro UWP podporovat více instancí. Pokud je spuštěná instance aplikace pro UPW s více instancemi a projde následná žádost o aktivaci, platforma stávající instanci neaktivuje. Místo toho vytvoří novou instanci spuštěnou v samostatném procesu.

Důležitý

Podpora více instancí je zajištěna pro JavaScriptové aplikace, ale přesměrování s využitím více instancí nikoliv. Vzhledem k tomu, že více instancí přesměrování není podporováno pro javascriptové aplikace, není AppInstance třída užitečná pro takové aplikace.

Povolit funkčnost s více instancemi

Pokud vytváříte novou aplikaci s více instancemi, můžete nainstalovat šablony projektů aplikací s více instancemi.VSIX, které jsou k dispozici na Visual Studio Marketplace. Jakmile nainstalujete šablony, budou k dispozici v dialogovém okně Nový projekt pod Visual C# > Univerzální Windows (nebo Jiných jazycích > Visual C++ > Univerzální Windows).

Poznámka

Šablona projektu aplikace s více instancemi už není k dispozici. Šablona VSIX byla pohodlná, takže místo toho budete muset upravit stávající projekt, jak je popsáno níže. Nezapomeňte přidat DISABLE_XAML_GENERATED_MAIN konstantu do symbolů sestavení projektu, protože tím zabráníte vygenerování výchozího main(). To umožňuje použití speciálně napsané verze Main() specifické pro aplikaci.

Nainstalují se dvě šablony: aplikace pro více instancí UWP, která poskytuje šablonu pro vytvoření aplikace s více instancemi, a aplikace pro přesměrování více instancí UWP, která poskytuje další logiku, na jejímž základě můžete buď spustit novou instanci, nebo selektivně aktivovat instanci, která již byla spuštěna. Například možná budete chtít současně upravovat stejný dokument jenom jednu instanci, takže místo spuštění nové instance přenesete instanci, která má tento soubor otevřený na popředí.

Obě šablony přidávají SupportsMultipleInstances do souboru package.appxmanifest. Všimněte si předpony oboru názvů desktop4 a iot2: více instancí podporují pouze projekty, které cílí na plochu, nebo projekty Internetu věcí (IoT).

<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>

Přesměrování víceinstanční aktivace

Podpora více instancí aplikací pro UWP má větší rozsah než jen umožnění prostého spuštění více instancí aplikace. Umožňuje přizpůsobení v případech, kdy chcete vybrat, jestli se spustí nová instance vaší aplikace, nebo jestli je aktivovaná instance, která už běží. Pokud se například spustí aplikace pro úpravu souboru, který už je upravován v jiné instanci, můžete chtít aktivaci přesměrovat na tuto instanci místo otevření jiné instance, která už soubor upravuje.

Pokud ho chcete vidět v akci, podívejte se na toto video o vytváření aplikací pro UPW s více instancemi.

Šablona aplikace UWP pro přesměrování více instancí přidá SupportsMultipleInstances do souboru package.appxmanifest, jak je znázorněno výše, a také přidá Program.cs (nebo Program.cpp, pokud používáte verzi šablony jazyka C++) do vašeho projektu, který obsahuje funkci Main(). Logika přesměrování aktivace probíhá ve funkci Main. Šablona pro Program.cs je zobrazená níže.

Vlastnost AppInstance.RecommendedInstance představuje upřednostňovanou instanci prostředí pro tuto žádost o aktivaci, pokud existuje jedna (nebo null pokud neexistuje). Pokud prostředí poskytuje předvolbu, můžete aktivaci přesměrovat do této instance nebo ji můžete ignorovat, pokud zvolíte.

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() je první věc, která se spouští. Spustí se před OnLaunched a OnActivated. To vám umožní určit, jestli se má tato nebo jiná instance aktivovat před spuštěním jakéhokoli jiného inicializačního kódu v aplikaci.

Výše uvedený kód určuje, zda je aktivována existující nebo nová instance vaší aplikace. Klíč se používá k určení, jestli existuje existující instance, kterou chcete aktivovat. Například, pokud lze vaši aplikaci spustit pro Zpracování aktivace souboru, můžete použít název souboru jako klíč. Pak můžete zkontrolovat, jestli už je instance vaší aplikace zaregistrovaná s tímto klíčem, a aktivovat ji místo otevření nové instance. Toto je myšlenka kódu: var instance = AppInstance.FindOrRegisterInstanceForKey(key);

Pokud se najde instance zaregistrovaná s klíčem, aktivuje se tato instance. Pokud se klíč nenajde, vytvoří aktuální instance (instance, která je aktuálně spuštěná Main), objekt aplikace a spustí se.

Úlohy na pozadí a více instancí

  • Úlohy na pozadí mimo hlavní proces podporují více instancí. Každá nová aktivační událost obvykle vede k vytvoření nové instance úlohy na pozadí (i když technicky řečeno, několik úloh na pozadí může běžet ve stejném hostitelském procesu). Nicméně je vytvořena jiná instance úlohy na pozadí.
  • Úlohy na pozadí v proc nepodporují více instancí.
  • Úlohy zvuku na pozadí nepodporují spuštění více instancí.
  • Když aplikace zaregistruje úlohu na pozadí, obvykle nejprve zkontroluje, jestli už je úloha zaregistrovaná, a pak ji buď odstraní a znovu zaregistruje, nebo nic nedělá, aby zachovala stávající registraci. Toto je stále typické chování u aplikací s více instancemi. Aplikace s více instancemi se ale může rozhodnout pro registraci jiného názvu úlohy na pozadí pro jednotlivé instance. Výsledkem bude více registrací pro stejnou aktivační událost a při aktivaci triggeru se aktivuje několik instancí úloh na pozadí.
  • Služba App Services spouští pro každé připojení samostatnou instanci úlohy na pozadí služby App Service. U aplikací s více instancemi to zůstane beze změny. To znamená, že každá instance aplikace s více instancemi získá svou vlastní instanci úlohy na pozadí služby App Service.

Další důležité informace

  • Aplikace UWP, které cílí na projekty desktopových a internet věcí (IoT), podporují práci s více instancemi.
  • Aby se předešlo podmínkám závodu a problémům se souběžností, musí aplikace s více instancemi podniknout kroky k rozdělení nebo synchronizaci přístupu k nastavení, místnímu úložišti aplikace a jakémukoli jinému prostředku (například uživatelským souborům, úložišti dat atd.), které lze sdílet mezi několika instancemi. K dispozici jsou standardní synchronizační mechanismy, jako jsou mutexy, semafory, události atd.
  • Pokud má aplikace SupportsMultipleInstances v souboru Package.appxmanifest, jeho rozšíření nemusí deklarovat SupportsMultipleInstances.
  • Pokud přidáte SupportsMultipleInstances do jakéhokoli jiného rozšíření kromě úloh na pozadí nebo aplikačních služeb a aplikace, která je hostitelem rozšíření, nehlásí ani SupportsMultipleInstances v souboru Package.appxmanifest, vygeneruje se chyba schématu.
  • Aplikace můžou v manifestu použít deklaraci ResourceGroup k seskupení více úloh na pozadí do stejného hostitele. To je v konfliktu s více instancemi, kdy každá aktivace přejde do samostatného hostitele. Aplikace proto nemůže v manifestu deklarovat SupportsMultipleInstances i ResourceGroup.

Ukázka

Příklad přesměrování aktivace s více instancemi naleznete v ukázce .

Viz také

AppInstance.FindOrRegisterInstanceForKeyAppInstance.GetActivatedEventArgsAppInstance.RedirectActivationToZpracování aktivace aplikace