Laden...

UWP BackgroundTask.exe returned with ExitCode 1

Erstellt von Viperos vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.416 Views
V
Viperos Themenstarter:in
12 Beiträge seit 2017
vor 5 Jahren
UWP BackgroundTask.exe returned with ExitCode 1

Hallo,

ich arbeite derzeit an einem UWP Projekt was es nötig macht mich mit BackgroundTasks zu beschäftigen.

Zunächst sah auch alles ok aus, bis mir auffiel das der Debugger probleme meldete (das Auswerten von variablen über "das IntelliSense/den Debugger" dauerte bei der ersten inspizierung bis zu einer Minute) und beim Exit der Anwendung dauerte es auch immer länger bis auch VS das debuggen beendete. Dabei fiel mir im Output folgende Meldung auf

The program backgroundTaskHost.exe has exited with code 1

Nach dieser Meldung läuft die App und der Debugger aber normal.

Das suggeriert mir jetzt das der BackgroundTask wohl irgendein problem verursacht, aber wo nur. Der BackgroundTask sieht folgendermaßen aus:


public sealed class DoWorkBackgroundTask : 
        IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            var cancellationTokenSource = new CancellationTokenSource();
            taskInstance.Canceled += (s, e) =>
            {
                cancellationTokenSource.Cancel();
                Debug.WriteLine("Task canceled");
            };

            var deferral = taskInstance.GetDeferral();
            Debug.WriteLine("Get deferral");
            try
            {
                Debug.WriteLine("Do Work");
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                deferral.Complete();
                Debug.WriteLine("Deferral completed");
            }
        }
    }


Die Registrierung in der Package.appxmanifest sieht so aus.


<Extension Category="windows.backgroundTasks" EntryPoint="HalloWorld.DoWorkBackgroundTask">
          <BackgroundTasks>
            <Task Type="systemEvent" />
          </BackgroundTasks>
        </Extension>

Was mir in Tests aufgefallen ist:

Lasse ich zunächst die XML Registrierung weg läuft die App und der Debugger wie erwartet.

Ändere ich die Registrierung im XML und lasse


<BackgroundTasks>
            <Task Type="systemEvent" />
          </BackgroundTasks>

weg so funktioniert der Debugger und die App ebenfalls, das Registrieren des Tasks im Code schlägt dann jedoch mit der Meldung das die Klasse nicht registriert sei fehl.

Der Task wird folgender maßen registriert:


public IBackgroundTaskRegistration Register(string name, string entryPoint, IBackgroundTrigger trigger, bool cancelOnConditionLoss = true, bool isNetworkRequested = false, params IBackgroundCondition[] conditions)
        {
            var builder = new BackgroundTaskBuilder()
            {
                Name = name,
                TaskEntryPoint = EntryPoint,
                CancelOnConditionLoss = cancelOnConditionLoss,
                IsNetworkRequested = isNetworkRequested
            };

            conditions?.ToList().ForEach(builder.AddCondition);
            builder.SetTrigger(trigger);

            return builder.Register();
        }


public void Setup()
        {

            var requestAccess = await BackgroundExecutionManager.RequestAccessAsync();
                if (requestAccess != BackgroundAccessStatus.DeniedByUser &&
                    requestAccess != BackgroundAccessStatus.DeniedBySystemPolicy)
                {
                    Register(
                        typeof(DoWorkBackgroundTask).Name,
                        typeof(DoWorkBackgroundTask).FullName,
                        new SocketActivityTrigger(),
                        cancelOnConditionLoss: true,
                        isNetworkRequested: true,
                        conditions: new IBackgroundCondition[] {
                            new SystemCondition(SystemConditionType.InternetAvailable) });
                }
        }



Sichergestellt habe ich das der Task in einer Windows Runtime Component ist und das die App eine Referenz darauf hat.

Jetzt ist die Frage was mache ich falsch?

16.806 Beiträge seit 2008
vor 5 Jahren

Was hat denn Deine eigene Recherche bei der Google Suche nach The program backgroundTaskHost.exe has exited with code 1 ergeben?

Sofern Du das getan hättest, dürftest Du ein Hinweis auf deferral.Complete(); bekommen, der dafür verantwortlich ist und erklärt.

V
Viperos Themenstarter:in
12 Beiträge seit 2017
vor 5 Jahren

Hi, ja das ist mir schon klar, aber warum mit Code 1 und nicht mit 0.
Ich meine soviel macht der Task nun auch nicht.

Laut: SystemErrorCodes (Für BackgroundTasks speziel habe ich keine ExitCodes finden können)

steht 1 (0x1) für ERROR_INVALID_FUNCTION.

Und warum meint VS zu blockieren bis der BackgroundTaskHost mit besagtem ExitCode zurückkommt?
Selbst die VS Diagnostic Tools zeigen dabei nichts mehr an mit dem Hinweis:


The diagnostic Tools failed unexpected. The Diagnostics Hub Output in the Output window may contain additional Information.

Der Output ist dabei leer.

Dieses verhalten ist auch nur nach dem ersten Start der App zu beobachten.

Startet die App das erste mal wird der BackgroundTask registriert, VS verhält sich bis dahin wie erwartet. Bei jedem weiteren Start ist der Task bereits registriert und es kommt zu dem beobachteten Verhalten (ExitCode 1, VS blockiert, Diagnostic Tool funktionieren nicht).

V
Viperos Themenstarter:in
12 Beiträge seit 2017
vor 5 Jahren

Also was ich bis jetzt sagen kann ist dass das Verhalten wohl nur mit dem SocketActivityTrigger reproduzierbar ist. Verwende ich z.B. nen TimeTrigger so habe ich das in meinen Augen Fehlverhalten nicht.

Für mein Vorhaben benötige ich aber den SocketActivityTrigger.

Aber warum das so ist who knows.

16.806 Beiträge seit 2008
vor 5 Jahren

Es ist kein Fehlverhalten. Les bitte mein Beitrag.

V
Viperos Themenstarter:in
12 Beiträge seit 2017
vor 5 Jahren

ja habe ich, der BackgroundTask wird mit dem Deferral.Complete beendet und meldet dies so an den Host.

Aber warum schaut das so aus als ob dabei ein Fehler generiert wird (ExitCode 1 statt 0) der deiner Meinung nach normal ist. Wenn das so ist ists ja ok, und kann man nix dran machen, aber ich versuch es ja nur zu verstehen. Die Doku gibt da nicht viel drüber her. Das behindert die Arbeit in meinen Augen ungemein wenn das VS in diesem Szenario nicht so funktioniert wie es zu erwarten wäre, da man beim Debugstart erst ne Minute (ohne Compilezeit) warten muss bis man sich die Variablen überhaupt anschauen bzw. die Breakpoints weiter springen kann und beim Beenden der App wieder ne Minute warten muss bis der Debugger was auch immer beendet weil wieder auf den Exit Code 1 des BackgroundTaskHost gewartet werden muss.