Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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) |