2012-10-24 16 views
8

Per un'applicazione Windows 8, in C#/Xaml, provo a registrare un'attività in background. È difficile da dire ma suppongo che il mio compito in background sia ben registrato ma quando faccio clic sul nome del mio task in background nella barra degli strumenti di debug la mia app smette di funzionare senza alcun messaggio.Impossibile registrare un'attività in background attivata in base al tempo

Ho controllato il registro nel Visualizzatore eventi e ho ricevuto: "L'attività in background con il punto di ingresso MyApp.Pages.SampleBackgroundTask e il nome Attività di background orario di esempio non è riuscita ad attivare con il codice di errore 0x80010008."

Ecco il mio codice:

private async void Button_Click_BackgroundTask(object sender, RoutedEventArgs e) 
    { 
     string entryPoint = "MyApp.Pages.SampleBackgroundTask"; 
     string taskName = "Example hourly background task"; 
     TimeTrigger hourlyTrigger = new TimeTrigger(60, false); 

     BackgroundTaskRegistration myBackGroundTaskRegistration = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, null); 
     if(myBackGroundTaskRegistration != null) 
     AttachProgressAndCompletedHandlers(myBackGroundTaskRegistration); 
    } 


    public static BackgroundTaskRegistration RegisterBackgroundTask(String taskEntryPoint, 
                    String name, 
                    IBackgroundTrigger trigger, 
                    IBackgroundCondition condition) 
    { 

     var taskRegistered = false; 
     var iter = Windows.ApplicationModel.Background.BackgroundTaskRegistration.AllTasks; 

     foreach (var item in iter) 
     { 
      var task = item.Value; 
      if (task.Name == name) 
      { 
       taskRegistered = true; 
       return item.Value as BackgroundTaskRegistration; 
      } 
     } 


     var builder = new BackgroundTaskBuilder(); 

     builder.Name = name; 
     builder.TaskEntryPoint = taskEntryPoint; 
     builder.SetTrigger(trigger); 

     if (condition != null) 
     { 

      builder.AddCondition(condition); 
     } 

     BackgroundTaskRegistration taskBack = builder.Register(); 

     return taskBack; 
    } 


     private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task) 
    { 
     task.Progress += new BackgroundTaskProgressEventHandler(OnProgress); 
     task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted); 
    } 


    private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args) 
    { 
     var progress = "Progress: " + args.Progress + "%"; 

    } 


    private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args) 
    { 
     Debug.WriteLine("Hi"); 
    } 

ho aggiunto questo nel manifesto:

 <Extension Category="windows.backgroundTasks" EntryPoint="MyApp.Pages.SampleBackgroundTask"> 
     <BackgroundTasks> 
     <Task Type="timer" /> 
     </BackgroundTasks> 
    </Extension> 

ho dimenticato qualcosa?

Grazie per il vostro aiuto.

EDIT: ecco il codice del mio compito, all'interno di uno dei miei pagina del progetto:

 public sealed class SampleBackgroundTask : IBackgroundTask 
{ 
    public void Run(IBackgroundTaskInstance taskInstance) 
    { 
     BackgroundTaskDeferral _deferral = taskInstance.GetDeferral(); 

     _deferral.Complete(); 
    } 
} 
+0

Bene, per cominciare, si ha un metodo 'async' senza un' await' in esso, che dovrebbe essere un avvertimento del compilatore. – Servy

+1

MyApp.Pages.SampleBackgroundTask è un progetto separato all'interno della stessa soluzione? – Akinwale

+0

No, l'attività si trova in una classe diversa all'interno di una pagina del mio progetto. Dovrebbe essere su un progetto diverso? Ho modificato la mia domanda per aggiungere il codice dell'attività. –

risposta

6

ho avuto anche questo problema. Anch'io avevo il mio nello stesso progetto. Alla fine ho potuto farlo spostando l'attività in un progetto separato. Ho dovuto impostare l'output del progetto come componente di runtime di Windows (nella scheda delle applicazioni dell'applicazione). Inoltre, non dimenticare di aggiungere il progetto come riferimento.

+0

Grazie! Questa informazione è fantastica! –

3

È necessario disporre dell'autorizzazione utente prima di poter eseguire un BackgroundTask. È possibile farlo manualmente: aprendo l'app e facendo clic su Autorizzazioni in Impostazioni Charm e attivando l'impostazione Blocca schermo su on.

È inoltre possibile richiedere all'utente quando il primo schermo è caricato con questo:

BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync(); 

Inutile dire che quest'ultima sta per portare ad una migliore esperienza utente.

2

Aggiungi il tuo progetto di attività in background nel progetto principale come riferimento e ricostruzione. funzionerà

3

Due anni più tardi, ora WinRT in Windows 10, Visual Studio 2015. Ancora, lo stesso problema.

Il richiedente ha indicato che il suo compito in background era residente nello stesso progetto. Ciò non funzionerà: un articolo molto approfondito sulle attività in background è here. Inoltre, come notato da Tim, deve prima essere chiamato BackgroundExecutionManager.RequestAccessAsync(). Dall'8,1, tuttavia, quando viene omesso, the background task registration will fail in that case, così non si arriva mai al punto in cui l'attivazione del task ha esito negativo.

Riassumendo i requisiti:

  • 'attendono BackgroundExecutionManager.RequestAccessAsync()' prima
  • classe Task deve essere in un progetto Windows Runtime Component
  • Il progetto Windows Runtime componente deve essere referenziato in app chiamata
  • La classe compito devono essere dichiarati nel manifesto della app come sopra, con nome completo del namespace
  • Il progetto del componente Runtime di Windows e l'app che lo utilizza devono avere come target la stessa versione di Windows. Esplora soluzioni in Visual Studio -> Fare clic con il tasto destro del mouse sul progetto -> Proprietà -> Applicazione risp. Scheda Libreria -> Targeting -> Versione target e di destinazione.

Nel mio esempio, avevo sicuramente fatto tutti questi, ma il compito non sarebbe stato attivato. La traccia di debug mostrava che "Il programma" [0x72C] backgroundTaskHost.exe "è stato chiuso con il codice 1", il debugger si è rotto su una ExecutionEngineException e il registro eventi della macchina di destinazione (Registri applicazioni e servizi -> Microsoft -> Windows -> BackgroundTaskInfrastructure -> Operational) ha elencato tutti i tipi di codici di errore di Windows non documentati completamente creativi:

"Impossibile eseguire l'attività in background con punto di ingresso e nome con codice errore 0x8007001F (o 0x800706BE/0x80131509)."

I guasti erano irregolari: in un primo momento, si verificavano solo raramente e peggioravano in più sessioni successive del programma, fino a quando l'attività in background non veniva più chiamata.

Quando il nome dello spazio dei nomi delle attività in background è stato modificato (in tutte le attività di registrazione, manifest del pacchetto e codice), questo ha risolto l'errore in un primo momento e poi anche peggiorato nel tempo.

La circostanza speciale in questo caso è stata che l'app è stata sviluppata su un computer di destinazione remoto e ha eseguito il debug con il debugger remoto. Rimozione del pacchetto dell'app prima che ogni esecuzione del debugger si sia sbarazzata degli errori.

Quindi, questi errori quando si esegue un'attività in background (0x8007001F/0x800706BE/0x80131509) sembrano avere a che fare con il non trovare correttamente l'attività registrata. Potrebbe essere utile assicurarsi che l'attività sia stata correttamente annullata e rimuovere il pacchetto dell'app prima di eseguire una nuova modifica. Comando Powershell:

Get-AppPackage | where name -eq <myAppPackageGuid> | Remove-AppPackage 

Basta documentarlo qui nel caso in cui qualcuno abbia lo stesso problema.

+0

La chiave per me era che l'applicazione * e * il componente WinRT dovevano avere come target la stessa versione di Windows. Nel mio caso il mio componente WinRT con l'attività in background era il targeting per l'aggiornamento di anniversario e la mia app aveva come target l'aggiornamento di Creator. Una volta allineati, l'attività in background viene eseguita in modo appropriato. –

0

Il problema che avevo durante la scrittura di attività in background era che in Windows 10 in Impostazioni-> Privacy-> App in background, dovevo abilitare l'opzione per consentire alle app di funzionare in background. Spero che questo aiuti qualcuno!

Problemi correlati