Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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) |
Relaterat innehåll
Windows developer