Condividi tramite


Strategia di migrazione delle attività in background

Le attività in background vengono usate principalmente nelle app UWP per l'esecuzione di processi quando viene richiamato un determinato trigger nel computer. Poiché questi non richiedono l'esecuzione di alcun servizio in ascolto dei trigger, sono molto efficienti dal punto di vista energetico. Pertanto, durante la migrazione di app UWP a WinUI 3 e ad altre app desktop che usano Windows App SDK, gli sviluppatori potrebbero richiedere il supporto per l'implementazione di attività in background nella piattaforma.

Le attività in background offerte nel modello di app UWP possono essere eseguite al di fuori del processo (out-of-proc) o all'interno del processo (in-proc). Questo articolo descrive la strategia di migrazione per ognuno di questi tipi quando si passa a BackgroundTaskBuilder API in Windows App SDK.

Attività in background out-of-process

Nel caso di attività in background out-of-process in UWP, le attività in background verranno scritte come componenti Windows Runtime (WinRT) e il componente viene impostato come TaskEntryPoint nel BackgroundTaskBuilder durante la registrazione. Durante la migrazione a Windows App SDK, gli sviluppatori possono mantenere questo così com'è e creare un pacchetto del componente WinRT insieme al progetto desktop. In questo caso, l'infrastruttura broker avvierà backgroundtaskhost il processo quando viene richiamato il trigger e l'attività in background del componente WinRT verrà eseguita nel processo. In questo approccio, un'attività in background verrà eseguita in un processo a basso livello di integrità (IL) (backgroundtaskhost.exe) mentre il progetto principale del desktop verrà eseguito in un processo a livello di integrità medio.

Se l'applicazione deve eseguire un'attività in background in un processo IL medio, è necessario usare il componente COM con attendibilità completa per le attività in background. In questo scenario, gli sviluppatori devono usare il Windows App SDK BackgroundTaskBuilder per registrare il componente COM con attendibilità completa. Si noti che l'API BackgroundTaskBuilder dello spazio dei nomi Windows.ApplicationModel.Background genererà eccezioni durante la registrazione di alcuni trigger.

Un esempio completo di registrazione delle attività in background winUI è disponibile in GitHub.

Altre informazioni sull'implementazione sono disponibili qui. L'unica modifica necessaria consiste nel sostituire l'API WinRT BackgroundTaskBuilder con l'API Windows App SDK Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilder.

Attività in background nel processo

Per le attività in background nel processo UWP, le routine delle attività in background vengono implementate nel callback OnBackgroundActivated, che viene eseguito come parte del processo in primo piano. Questo non sarà possibile in un'applicazione WinUI perché i callback OnBackgroundActivated non sono disponibili. L'applicazione deve spostare le implementazioni dell'attività in background in attività COM attendibili complete come descritto in precedenza e definire il server COM nel manifesto del pacchetto per gestire l'attivazione COM dell'attività. Quando si verifica il trigger, l'attivazione COM avverrà nella coclasse COM corrispondente associata al trigger.

Un esempio completo di registrazione delle attività in background winUI è disponibile in GitHub.

Altre informazioni sull'implementazione sono disponibili qui. L'unica modifica consiste nel sostituire l'API WinRT BackgroundTaskBuilder con le API Windows App SDK in Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilder.

Windows App SDK API BackgroundTaskBuilder

Esistono due versioni diverse dell'API BackgroundTaskBuilder . L'API Windows.ApplicationModel.BackgroundTaskBuilder è stata progettata per le applicazioni UWP e molti dei trigger di attività in background non sono supportati per i componenti COM attendibili. Sono supportati solo quando vengono registrati con componenti WinRT avviati con un processo backgroundtaskhost. Per questo motivo, le applicazioni desktop di Windows App SDK non possono registrare direttamente i componenti COM a fiducia completa da avviare con trigger di attività in background. Richiedono una soluzione alternativa per includere i componenti WinRT nel progetto. L'API Microsoft.Windows.ApplicationModel.BackgroundTaskBuilder inclusa nella Windows App SDK evita questa soluzione alternativa in modo che WinUI 3 e altre applicazioni desktop che usano Windows App SDK possano registrare i componenti COM attendibili direttamente con le attività in background.

Il codice seguente illustra come registrare l'attività in background usando Windows App SDK BackgroundTaskBuilder API:

//Using Windows App SDK API for BackgroundTaskBuilder
winrt::Microsoft::Windows::ApplicationModel::Background::BackgroundTaskBuilder builder;
SystemTrigger trigger = SystemTrigger(SystemTriggerType::TimeZoneChange, false);
auto backgroundTrigger = trigger.as<IBackgroundTrigger>();
builder.SetTrigger(backgroundTrigger);
builder.AddCondition(SystemCondition(SystemConditionType::InternetAvailable));
builder.SetTaskEntryPointClsid(classGuid);
builder.Register();

Di seguito è riportato il codice C# equivalente:

// Using Windows App SDK API for BackgroundTaskBuilder
var builder = new Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilder();
var trigger = new SystemTrigger(SystemTriggerType.TimeZoneChange, false);
builder.SetTrigger(trigger);
builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
builder.SetTaskEntryPointClsid(classGuid);
builder.Register();

Per usare questa API, aggiungere il tag seguente al file project per abilitare le attività in background Windows App SDK:

<WindowsAppSDKBackgroundTask>true</WindowsAppSDKBackgroundTask>

Inoltre, nel file manifesto, EntryPoint per BackgroundTask è impostato su Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task:

<Extension Category="windows.backgroundTasks" EntryPoint="Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task">
    <BackgroundTasks>
        <Task Type="general"/>
    </BackgroundTasks>
</Extension>

Per le applicazioni C#, è necessario aggiungere anche una registrazione ActivatableClass al file manifesto:

<Extension Category="windows.activatableClass.inProcessServer">
    <InProcessServer>
        <Path>Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.dll</Path>
        <ActivatableClass ActivatableClassId="Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task" ThreadingModel="both"/>
    </InProcessServer>
</Extension>

Uso di TaskScheduler per la migrazione delle attività in background

Utilità di pianificazione consente alle app desktop di ottenere le stesse funzionalità fornite da BackgroundTaskBuilder nelle app UWP. Altre informazioni sulle implementazioni che usano TaskScheduler sono disponibili qui.

Uso di ApplicationTrigger nelle applicazioni Windows App SDK

ApplicationTrigger è supportato nelle applicazioni UWP a causa dello scenario di gestione della durata in cui il processo dell'applicazione può essere sospeso. Questo scenario non si verifica per WinUI e altre applicazioni desktop Windows App SDK, quindi questo trigger non è supportato nelle applicazioni WinUI. Tutta la logica correlata ad ApplicationTrigger dovrà essere riscritta per l'esecuzione avviando un altro processo o eseguendo in un thread del pool di thread. Per altre informazioni, vedere CreateThread e CreateProcess.