Aplikacje wieloinstancyjne w Zestaw SDK do aplikacji systemu Windows

Domyślnie aplikacja klasyczna Zestaw SDK do aplikacji systemu Windows może uruchamiać wiele wystąpień jednocześnie. Każde wystąpienie jest uruchamiane jako oddzielny proces. To zachowanie można kontrolować przy użyciu Microsoft.Windows. AppLifecycle.AppInstance, klasa do rejestrowania wystąpień, wykrywania istniejących i przekierowywania aktywacji.

Scenariusze zarządzania wieloma instancjami

  • Wymuszanie pojedynczej instancji — Przekierowywanie nowych uruchomień do już uruchomionej instancji.
  • Trasowanie oparte na kluczu — Kierowanie różnych plików lub URI do określonych instancji (na przykład jedna instancja na dokument).
  • Odnajdywanie wystąpień — wylicza wszystkie uruchomione wystąpienia w celu koordynowania pracy.

Rejestrowanie wystąpienia przy użyciu klucza

Użyj AppInstance.FindOrRegisterForKey w metodzie Main aplikacji, aby zarejestrować klucz. Jeśli klucz jest już zarejestrowany przez inne wystąpienie, możesz przekierować aktywację. Poniższą niestandardową metodę Main należy umieścić w Program.cs, przed jakąkolwiek inicjalizacją XAML:

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

Aby użyć metody niestandardowej Main , wyłącz automatycznie wygenerowany punkt wejścia. W pliku .csproj ustaw <DefineConstants>$(DefineConstants);DISABLE_XAML_GENERATED_MAIN</DefineConstants> tak, aby dodać symbol bez nadpisywania istniejących definicji.

Wymuszanie zachowania pojedynczego wystąpienia

Aby utworzyć jedno wystąpienie aplikacji, zawsze użyj tego samego klucza:

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

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

Wyliczanie uruchomionych wystąpień

Użyj AppInstance.GetInstances() polecenia , aby odnaleźć wszystkie zarejestrowane wystąpienia:

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

Wyrejestrowywanie wystąpienia

Gdy instancja zostanie wyłączona, rejestracja zostanie automatycznie usunięta. Możesz również jawnie się wyrejestrować:

AppInstance.GetCurrent().UnregisterKey();

Różnice między wieloma wystąpieniami platformy UWP

Funkcja platforma UWP Zestaw SDK do aplikacji systemu Windows
Namespace Windows.ApplicationModel.AppInstance Microsoft.Windows.AppLifecycle.AppInstance
Wymóg manifestu SupportsMultipleInstances atrybut Nie jest wymagane dla aplikacji klasycznych
Odkrywanie instancji AppInstance.GetInstances() AppInstance.GetInstances() (ten sam wzorzec)
Przekierowanie aktywacji AppInstance.RedirectActivationTo() AppInstance.RedirectActivationToAsync() (asynchronizuj)
Niestandardowy główny punkt wejścia Wymagane Wymagane (to samo podejście)