Partager via


Convertir un service d’application pour qu’il s’exécute dans le même processus que son application hôte

Une Application AppServiceConnection permet à une autre application de réveiller votre application en arrière-plan et de démarrer une ligne de communication directe avec celle-ci.

Avec l’introduction d’App Services in-process, deux applications de premier plan en cours d’exécution peuvent avoir une ligne de communication directe via une connexion App Service. App Services peut désormais s’exécuter dans le même processus que l’application de premier plan, ce qui facilite la communication entre les applications et supprime la nécessité de séparer le code du service en un projet distinct.

La transformation d’un modèle hors processus App Service en modèle in-process nécessite deux modifications. La première est une modification de manifeste.

<Package
   ...
  <Applications>
      <Application Id=...
          ...
          EntryPoint="...">
          <Extensions>
              <uap:Extension Category="windows.appService">
                  <uap:AppService Name="InProcessAppService" />
              </uap:Extension>
          </Extensions>
          ...
      </Application>
  </Applications>

Supprimez l’attribut EntryPoint de l’élément <Extension> , car maintenant OnBackgroundActivated() est le point d’entrée qui sera utilisé lorsque le service d’application est appelé.

La deuxième modification consiste à déplacer la logique de service de son projet de tâche en arrière-plan distinct dans des méthodes qui peuvent être appelées à partir d’OnBackgroundActivated ().

À présent, votre application peut exécuter directement votre App Service. Par exemple, dans App.xaml.cs :

[! REMARQUE] Le code ci-dessous est différent de celui fourni par exemple 1 (service hors processus). Le code ci-dessous est fourni uniquement à des fins d’illustration et ne doit pas être utilisé dans le cadre de l’exemple 2 (service in-process). Pour poursuivre la transition de l’article de l’exemple 1 (service hors processus) dans l’exemple 2 (service in-process) continuez à utiliser le code fourni par exemple 1 au lieu du code d’illustration ci-dessous.

using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
...

sealed partial class App : Application
{
  private AppServiceConnection _appServiceConnection;
  private BackgroundTaskDeferral _appServiceDeferral;

  ...

  protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
  {
      base.OnBackgroundActivated(args);
      IBackgroundTaskInstance taskInstance = args.TaskInstance;
      AppServiceTriggerDetails appService = taskInstance.TriggerDetails as AppServiceTriggerDetails;
      _appServiceDeferral = taskInstance.GetDeferral();
      taskInstance.Canceled += OnAppServicesCanceled;
      _appServiceConnection = appService.AppServiceConnection;
      _appServiceConnection.RequestReceived += OnAppServiceRequestReceived;
      _appServiceConnection.ServiceClosed += AppServiceConnection_ServiceClosed;
  }

  private async void OnAppServiceRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
  {
      AppServiceDeferral messageDeferral = args.GetDeferral();
      ValueSet message = args.Request.Message;
      string text = message["Request"] as string;

      if ("Value" == text)
      {
          ValueSet returnMessage = new ValueSet();
          returnMessage.Add("Response", "True");
          await args.Request.SendResponseAsync(returnMessage);
      }
      messageDeferral.Complete();
  }

  private void OnAppServicesCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
  {
      _appServiceDeferral.Complete();
  }

  private void AppServiceConnection_ServiceClosed(AppServiceConnection sender, AppServiceClosedEventArgs args)
  {
      _appServiceDeferral.Complete();
  }
}

Dans le code ci-dessus, la OnBackgroundActivated méthode gère l’activation d’App Service. Tous les événements requis pour la communication via appServiceConnection sont enregistrés et l’objet de report de tâche est stocké afin qu’il puisse être marqué comme terminé lorsque la communication entre les applications est terminée.

Lorsque l’application reçoit une demande et lit l’ensemble de valeurs fourni pour voir si les chaînes et Value les Key chaînes sont présentes. S’ils sont présents, le service d’application retourne une paire de valeurs de Response chaîne à True l’application de l’autre côté de AppServiceConnection.

En savoir plus sur la connexion et la communication avec d’autres applications dans Create and Consume an App Service.