locked
BackGround task RRS feed

  • Question

  • Bonjour, je dois pour mon entreprise développer une application Windows phone 10 qui permet de signaler à des personnels une opération à effectuer.

    Pour cela il faut que j'interroge de manière récurrente toutes les 5mn une base de donnée de type SQL-Server, puis effectuer une notification avec son et vibration.

    Pour la partie SQL-Server j'ai développer un web-service qui fonctionne.

    Toutefois je me heurte à des problèmes avec les taches de fond.

        Ce que j'ai fait

          - Je lance deux fois la même tache, une fois avec un trigger AppTrigger et l'autre fois avec TimerTigger

         - Ma tache à une durée de vie de 9mn, et appel OnCompleted() si l'UI est active elle relance les taches en prenant soins de supprimer les abonnements, si l'UI n'est pas active OnCompleted() ne sera pas traité et c'est la tache lié au trigger TimerTrigger qui sera lancé.

         - le problème est que des que mon écran est verrouillé ou que mon application n'est plus en premier plan mes taches ce stoppe......

    Public Sub Run(taskInstance As IBackgroundTaskInstance) Implements IBackgroundTask.Run
                _settings = ApplicationData.Current.LocalSettings
    
                TimeOut = New Stopwatch
                TimeOut.Start()
    
                _invokeCount = 5
    
                _MaxCount = _settings.Values("TpsUp")
                _Req = _settings.Values("SQL")
    
                _wifiSSID = FctWifiSSID()
                _bloque = False
    
                AddHandler taskInstance.Canceled, New BackgroundTaskCanceledEventHandler(AddressOf OnCanceled)
                _deferral = taskInstance.GetDeferral()
    
                _taskInstance = taskInstance
    
                '   Creation d'un timer appelé toutes les secondes
                _periodicTimer = ThreadPoolTimer.CreatePeriodicTimer(New TimerElapsedHandler(AddressOf PeriodicTimerCallback), TimeSpan.FromSeconds(1))
    
            End Sub

    Dans mon timer j'effectue mon traitement ainsi que la sortie de ma tache

    Private Async Sub PeriodicTimerCallback(timer As ThreadPoolTimer)
                If _bloque Then
                    Exit Sub
                End If
    
                _bloque = True
    
                '   Demande de cancel depuis l'UI
                If _settings.Values.ContainsKey("TaskCancel") AndAlso _settings.Values("TaskCancel") Then
                    _cancelRequested = True
                End If
    
                '   Cancel pour stoper la tache de fond, temps à 9mn permet de quitter pour relancer la tache de fond
                If (_cancelRequested = False) AndAlso (TimeOut.Elapsed.Seconds <= (9 * 60)) Then
                    _taskInstance.Progress = _invokeCount
    
                    _settings.Values("SSID") = _wifiSSID
    
                    '   Quand compteur atteind
                    If _invokeCount <= 0 Then
    
                        _wifiSSID = FctWifiSSID()
    
                        '   il y a un SSID !!
                        If _wifiSSID.Length > 0 Then
                            Await SQLRead()
                            _settings.Values("Top") = True
                        End If
    
                        _invokeCount = _MaxCount                  'Reset compteur
                    End If
    
                    _invokeCount -= 1
                Else
                    _periodicTimer.Cancel()
                    Debug.WriteLine("Background " & _taskInstance.Task.Name)
                    _settings.Values("Task") = False
                    _deferral.Complete()
                End If
    
                _bloque = False
            End Sub

    Dans mon UI j'initialise les Taches, l'appel Unregistrer() permet de supprimer les taches

    Private Async Sub RegistrerAsync()
            Dim access = Await BackgroundExecutionManager.RequestAccessAsync()
    
            Unregistrer()
    
            If Init() Then
                SettingOK = True
    
                Select Case access
                    Case BackgroundAccessStatus.Unspecified
                        Exit Select
                    Case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity
                        Toast("AllowedMayUseActiveRealTimeConnectivity")
                        Exit Select
                    Case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity
                        Toast("AllowedWithAlwaysOnRealTimeConnectivity")
                        Exit Select
                    Case BackgroundAccessStatus.Denied
                        Exit Select
                    Case Else
                        Exit Select
                End Select
    
    
                '   Premiére tache lancer sur AppTrigger
                Dim builder = New BackgroundTaskBuilder
    
                builder.Name = Echange_Tache.TaskAppTriggerName
                builder.TaskEntryPoint = Echange_Tache.TaskPointEntree
    
                Dim AppTrigger As New ApplicationTrigger()          'Premier trigger lance la tache de fond sur RequestAsync
                builder.SetTrigger(AppTrigger)
                TaskAppTrigger = builder.Register()
                Await AppTrigger.RequestAsync()
    
                AddHandler TaskAppTrigger.Completed, New BackgroundTaskCompletedEventHandler(AddressOf OnCompleted)
                AddHandler TaskAppTrigger.Progress, New BackgroundTaskProgressEventHandler(AddressOf OnProgress)
    
                '   Dexuxiéme tache lancer sur timeTrigger
                Dim builder2 = New BackgroundTaskBuilder
    
                builder2.Name = Echange_Tache.TaskTimeTriggerName
                builder2.TaskEntryPoint = Echange_Tache.TaskPointEntree
    
                builder2.SetTrigger(New TimeTrigger(15, False))
                TaskTimeTrigger = builder2.Register()
    
                AddHandler TaskTimeTrigger.Completed, New BackgroundTaskCompletedEventHandler(AddressOf OnCompleted)
                AddHandler TaskTimeTrigger.Progress, New BackgroundTaskProgressEventHandler(AddressOf OnProgress)
    
            Else
                SettingOK = False
                Dim rep As New MessageDialog("Veuillez définir votre lieu d'IF ainsi que le temps de mise à jour.", "Votre application n'est pas configuré !!")
                Await rep.ShowAsync
            End If
    
        End Sub

    mon OnCompled() relance mes taches

    Private Sub OnCompleted(task As IBackgroundTaskRegistration, args As BackgroundTaskCompletedEventArgs)
            Debug.WriteLine("OnComplete background")
            Dim settings = ApplicationData.Current.LocalSettings
            settings.Values("Task") = False
            RegistrerAsync()
    End Sub

    vendredi 3 mars 2017 09:54

Réponses

Toutes les réponses