Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describe cómo crear aplicaciones para la Plataforma universal de Windows (UWP) de varias instancias.
Desde Windows 10, versión 1803 (10.0; Compilación 17134) en adelante, la aplicación para UWP puede optar por admitir varias instancias. Si se está ejecutando una instancia de una aplicación para UWP de varias instancias y se realiza una solicitud de activación posterior, la plataforma no activará la instancia existente. En su lugar, creará una nueva instancia, que se ejecuta en un proceso independiente.
Importante
La instanciación múltiple es compatible con las aplicaciones de JavaScript, pero el redireccionamiento de instanciación múltiple no lo es. Dado que el redireccionamiento de instancias múltiples no es compatible con las aplicaciones de JavaScript, la clase AppInstance no es útil para estas aplicaciones.
Participación en el comportamiento de varias instancias
Si va a crear una nueva aplicación de varias instancias, puede instalar el Plantillas de proyecto de aplicación de instancias múltiples.VSIX, disponible en la Visual Studio Marketplace. Una vez instaladas las plantillas, estarán disponibles en el cuadro de diálogo Nuevo proyecto en Visual C# > Windows Universal (u otros lenguajes > Visual C++ > Windows Universal).
Nota:
La plantilla Proyecto de aplicación de instancias múltiples ya no está disponible. La plantilla VSIX era una comodidad, por lo que deberá modificar el proyecto existente en su lugar, como se describe a continuación. Asegúrese de agregar la constante DISABLE_XAML_GENERATED_MAIN a los símbolos de compilación del proyecto, ya que esto impide que la compilación genere un main() predeterminado. Esto permite el uso de una versión específica de Main() especialmente escrita para la aplicación.
Se instalan dos plantillas: aplicación para UWP de instancias múltiples, que proporciona la plantilla para crear una aplicación de varias instancias y una aplicación para UWP de redirección de instancias múltiples, que proporciona lógica adicional en la que puedes compilar para iniciar una nueva instancia o activar de forma selectiva una instancia que ya se ha iniciado. Por ejemplo, quizás solo desea que una instancia a la vez edite el mismo documento, por lo tanto, trae al frente la instancia que tiene ese archivo abierto en lugar de iniciar una nueva instancia.
Ambas plantillas agregan SupportsMultipleInstances
al archivo package.appxmanifest
. Tenga en cuenta el prefijo de espacio de nombres desktop4
y iot2
: solo los proyectos que tienen como destino el escritorio o los proyectos de Internet de las Cosas (IoT) admiten instancias múltiples.
<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>
Redirección de activación de instancias múltiples
La compatibilidad con instancias múltiples para aplicaciones para UWP va más allá de simplemente permitir el inicio de varias instancias de la aplicación. Permite personalizar en los casos en los que desea seleccionar si se inicia una nueva instancia de la aplicación o si se activa una instancia que ya se está ejecutando. Por ejemplo, si la aplicación se inicia para editar un archivo que ya se está editando en otra instancia, puede que quiera redirigir la activación a esa instancia en lugar de abrir otra instancia que ya esté editando el archivo.
Para verlo en acción, vea este vídeo sobre la creación de aplicaciones para UWP de varias instancias.
La plantilla de aplicación de redirección de instancias múltiples para UWP agrega SupportsMultipleInstances
al archivo package.appxmanifest como se muestra anteriormente y también agrega un Program.cs (o Program.cpp, si usa la versión de C++ de la plantilla) al proyecto que contiene una función de Main()
. La lógica para redirigir la activación se encuentra en la Main
función . A continuación se muestra la plantilla de Program.cs .
La propiedad AppInstance.RecommendedInstance representa la instancia preferida proporcionada por el shell para esta solicitud de activación, si hay una (o null
si no hay ninguna). Si el shell proporciona una preferencia, puede redirigir la activación a esa instancia o puede omitirla si lo elige.
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()
es lo primero que se ejecuta. Se ejecuta antes de OnLaunched y OnActivated. Esto le permite determinar si se va a activar esta u otra instancia, antes de que se ejecute cualquier otro código de inicialización de la aplicación.
El código anterior determina si se activa una instancia existente o nueva de la aplicación. Se usa una clave para determinar si hay una instancia existente que desea activar. Por ejemplo, si su aplicación se puede iniciar para controlar la activación de archivos, puede usar el nombre de archivo como clave. A continuación, puede comprobar si una instancia de la aplicación ya está registrada con esa clave y activarla en lugar de abrir una nueva instancia. Esta es la idea detrás del código: var instance = AppInstance.FindOrRegisterInstanceForKey(key);
Si se encuentra una instancia registrada con la clave, esa instancia se activa. Si no se encuentra la clave, la instancia actual (la instancia que se está ejecutando Main
actualmente) crea su objeto de aplicación y comienza a ejecutarse.
Tareas en segundo plano e instancias múltiples
- Las tareas en segundo plano fuera de proceso admiten instancias múltiples. Normalmente, cada nuevo desencadenador da como resultado una nueva instancia de la tarea en segundo plano (aunque técnicamente se pueden ejecutar varias tareas en segundo plano en el mismo proceso de host). No obstante, se crea una instancia diferente de la tarea en segundo plano.
- Las tareas en segundo plano en proceso no admiten instancias múltiples.
- Las tareas de audio en segundo plano no admiten instancias múltiples.
- Cuando una aplicación registra una tarea en segundo plano, normalmente comprueba primero si la tarea ya está registrada y, a continuación, elimina y vuelve a registrarla, o no hace nada para mantener el registro existente. Este sigue siendo el comportamiento típico con aplicaciones de varias instancias. Sin embargo, una aplicación de instancias múltiples puede optar por registrar un nombre de tarea en segundo plano diferente por instancia. Esto dará lugar a varios registros para el mismo desencadenador y se activarán varias instancias de tarea en segundo plano cuando se active el desencadenador.
- App-services inicia una instancia independiente de la tarea en segundo plano de app-service para cada conexión. Esto permanece sin cambios para las aplicaciones de varias instancias; es decir, cada instancia de una aplicación de varias instancias obtendrá su propia instancia de la tarea en segundo plano del servicio de aplicación.
Consideraciones adicionales
- Las aplicaciones para UWP que tienen como destino proyectos de escritorio e Internet de las cosas (IoT) admiten instancias múltiples.
- Para evitar problemas de contención y condiciones de carrera, las aplicaciones de varias instancias deben tomar medidas para particionar o sincronizar el acceso a la configuración, el almacenamiento local de la aplicación y cualquier otro recurso (como los archivos de usuario, un almacén de datos, etc.) que puedan ser compartidos entre varias instancias. Los mecanismos de sincronización estándar, como los mutexes, los semáforos, los eventos, etc., están disponibles.
- Si la aplicación tiene
SupportsMultipleInstances
en su archivo Package.appxmanifest, sus extensiones no necesitan declararSupportsMultipleInstances
. - Si agregas
SupportsMultipleInstances
a cualquier otra extensión, aparte de tareas en segundo plano o app-services, y la aplicación que hospeda la extensión no también declaraSupportsMultipleInstances
en su archivo Package.appxmanifest, se genera un error de esquema. - Las aplicaciones pueden usar la declaración ResourceGroup en su manifiesto para agrupar varias tareas en segundo plano en el mismo host. Esto entra en conflicto con la creación de instancias múltiples, donde cada activación entra en un host independiente. Por lo tanto, una aplicación no puede declarar ni
SupportsMultipleInstances
ResourceGroup
en su manifiesto.
Ejemplo
Consulte ejemplo de instancias múltiples para obtener un ejemplo de redirección de activación de varias instancias.
Consulte también
AppInstance.FindOrRegisterInstanceForKeyAppInstance.GetActivatedEventArgsAppInstance.RedirectActivationToGestionar la activación de la aplicación