- var threadFunc = (SendOrPostCallback)delegate { ...... };
var job = Dispatcher.BeginInvoke(DispatcherPriority.Background, threadFunc, null);
job.Completed += ui_onCompletion;
- BeginInvoke() startet den Worker
- der Worker ist fertig, bevor der Haupt-Thread job.Completed += ui_onCompletion; aufruft
- ui_onCompletion() wird niemals aufgerufen und das Programm hängt
Nun wollte ich prüfen, ob das eine API-Garantie ist. Leider ist die Dokumentation von System.Windows.Threading.Dispatcher.BeginInvoke() und System.Windows.Threading.DispatcherOperation.Completed so gut wie wertlos.
Das Verhalten, das ich beobachte, lässt sich im Augenblick nur erklären durch
- Der Worker startet erst, nachdem job aufgeräumt wurde, was durch den Garbage Collector aber nicht deterministisch ist
- Der Worker wird in irgendeine Warteschlange eingereiht, die erst abgearbeitet wird, wenn der Haupt-Thread das nächste Mal seine Nachrichten verarbeitet, was aber irgendwie dem Zweck eines Thread Pools widerspricht