Appar med flera instanser med Windows App SDK

Som standard kan en Windows App SDK skrivbordsapp köra flera instanser samtidigt. Varje instans körs som en separat process. Du kan styra det här beteendet med hjälp av Microsoft.Windows. AppLifecycle.AppInstance-klass för att registrera instanser, identifiera befintliga och omdirigeringsaktiveringar.

Scenarier för hantering av flera instanser

  • Tillämpning av en enda instans – Omdirigera nya aktiveringar till den instans som redan körs.
  • Nyckelbaserad routning – Dirigera olika filer eller URI:er till specifika instanser (till exempel en instans per dokument).
  • Instansidentifiering – Räkna upp alla instanser som körs för att samordna arbetet.

Registrera en instans med en nyckel

Använd AppInstance.FindOrRegisterForKey i appens Main metod för att göra anspråk på en nyckel. Om nyckeln redan har registrerats av en annan instans kan du omdirigera aktiveringen. Följande anpassade Main metod finns i Program.cs, innan någon XAML-initiering:

using Microsoft.Windows.AppLifecycle;

public static class Program
{

[STAThread]
static async Task Main(string[] args)
{
    // Required before calling any other Windows App SDK or WinRT API
    // from a custom entry point.
    WinRT.ComWrappersSupport.InitializeComWrappers();

    // Determine a key for this activation
    string instanceKey = "main-instance";

    var activatedArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
    if (activatedArgs.Kind == ExtendedActivationKind.File)
    {
        var fileArgs = activatedArgs.Data as
            Windows.ApplicationModel.Activation.IFileActivatedEventArgs;
        // Use the file path as the instance key to route
        // each file to its own instance
        if (fileArgs?.Files is { Count: > 0 })
        {
            instanceKey = fileArgs.Files[0].Path;
        }
    }

    var instance = AppInstance.FindOrRegisterForKey(instanceKey);

    if (!instance.IsCurrent)
    {
        // Another instance owns this key — redirect activation to it
        await instance.RedirectActivationToAsync(activatedArgs);
        return; // Exit this process
    }

    // This instance owns the key — proceed with normal startup
    // Register for future redirected activations
    instance.Activated += OnActivated;

    Application.Start((p) =>
    {
        var context = new DispatcherQueueSynchronizationContext(
            DispatcherQueue.GetForCurrentThread());
        SynchronizationContext.SetSynchronizationContext(context);
        _ = new App();
    });
}

private static void OnActivated(object? sender, AppActivationArguments args)
{
    // Handle the redirected activation on the UI thread
    // For example, open the file or navigate to the URI
}

// App is the application type generated by the WinUI 3 project template
// (App.xaml / App.xaml.cs).
private partial class App : Microsoft.UI.Xaml.Application
{
}

}

Note

Om du vill använda en anpassad Main metod inaktiverar du den automatiskt genererade startpunkten. I din .csprojanger du <DefineConstants>$(DefineConstants);DISABLE_XAML_GENERATED_MAIN</DefineConstants> till att lägga till symbolen utan att skriva över befintliga definitioner.

Framtvinga beteende för en instans

Om du vill göra din app till en enda instans använder du alltid samma nyckel:

var instance = AppInstance.FindOrRegisterForKey("single-instance");

if (!instance.IsCurrent)
{
    await instance.RedirectActivationToAsync(
        AppInstance.GetCurrent().GetActivatedEventArgs());
    return;
}

Räkna upp instanser som körs

Använd AppInstance.GetInstances() för att identifiera alla registrerade instanser:

var instances = AppInstance.GetInstances();
foreach (var inst in instances)
{
    System.Diagnostics.Debug.WriteLine(
        $"Key: {inst.Key}, ProcessId: {inst.ProcessId}");
}

Avregistrera en instans

När instansen stängs av tas registreringen bort automatiskt. Du kan också avregistrera dig explicit:

AppInstance.GetCurrent().UnregisterKey();

Skillnader jämfört med UWP med flera instanser

Feature UWP Windows App SDK
Namespace Windows.ApplicationModel.AppInstance Microsoft.Windows.AppLifecycle.AppInstance
Manifestkrav SupportsMultipleInstances-attribut Krävs inte för skrivbordsappar
Instansupptäckt AppInstance.GetInstances() AppInstance.GetInstances() (samma mönster)
Aktiveringsomdirigering AppInstance.RedirectActivationTo() AppInstance.RedirectActivationToAsync() (async)
Anpassad huvudinmatningspunkt Obligatoriskt Krävs (samma metod)