Wie Sie eine Aufgabe erhalten, die NICHT im UI-Thread ausgeführt werden soll

8

Der folgende Code ist eine Vereinfachung eines Codes in einer realen Anwendung. Das Problem unten ist, dass eine lange Arbeit in dem UI-Thread statt eines Hintergrundthreads ausgeführt wird.

%Vor%

So Do () wird normalerweise aus dem UI-Kontext aufgerufen. Und auch ShortUIWork, wie vom TaskScheduler definiert. LongWork wird jedoch auch im UI-Thread aufgerufen, was natürlich die Benutzeroberfläche blockiert.

Wie kann sichergestellt werden, dass eine Aufgabe nicht im UI-Thread ausgeführt wird?

    
Tomba 17.03.2012, 07:38
quelle

1 Antwort

8

LongRunning ist lediglich ein Hinweis auf die TaskScheduler . Im Fall von SynchronizationContextTaskScheduler (wie von TaskScheduler.FromCurrentSynchronizationContext() zurückgegeben) ignoriert es anscheinend den Hinweis.

Auf der einen Seite scheint dies nicht eingängig zu sein. Wenn die Aufgabe lange ausgeführt wird, ist es unwahrscheinlich, dass sie im UI-Thread ausgeführt werden soll. Auf der anderen Seite, nach MSDN:

  

LongRunning - Gibt an, dass eine Aufgabe lange dauern wird.   grobkörniger Betrieb. Es gibt dem TaskScheduler einen Hinweis, dass   Überbelegung kann gerechtfertigt sein.

Da der UI-Thread kein Thread-Pool-Thread ist, kann keine "Überbelegung" (Thread-Pool-Verhungern) auftreten, daher ist es sinnvoll, dass der Hinweis keine Auswirkung auf SynchronizationContextTaskScheduler hat.

Unabhängig davon können Sie das Problem umgehen, indem Sie zum Standardaufgabenplaner wechseln:

%Vor%     
Kent Boogaart 17.03.2012, 09:36
quelle

Tags und Links