Dispatcher.Invoke() funktioniert nicht für die Anwendung
Arbeite ich an einem Projekt für meine Firma, in der Sie verwendet werden Dispatcher.Invoke()
in vielen Orten.Wenn ich mit BeginInvoke
anstelle von Aufrufen, dann die Synchronisation
zwischen threads wunderbar funktioniert, aber im Falle von Aufrufen, die Anwendung friert und auch nicht in der Ausführung, um die delegate-Methode auch. Hat jemand eine Idee, warum es passiert wie diesem?
Jede Antwort wird geschätzt.
Beispielcode für Invoke
im Projekt verwendet:
Dispatcher.Invoke(DispatcherPriority.Send,
new DelegateMethod(MethodtoExecute));
private delegate void DelegateMethod();
void MethodtoExecute()
{
try
{
}
catch (Exception /*ex*/)
{
}
finally
{
}
}
- Haben Sie versucht, diese Lösung: stackoverflow.com/questions/264163/...
- Nein, habe ich nicht versuchen, diese Lösung ließ mich in irgendeine Art und Weise danke für den link 🙂
- Wir brauchen mehr Informationen: Wie bekommen Sie das
Dispatcher
? Welcher code ist der Haupt-thread, wenn es friert? - Blockieren Sie niemals den UI-thread.
- Passant: Aber in bestimmten Umständen, die ich nicht zulassen, dass Benutzer den Zugriff auf die Benutzeroberfläche, Also für das, dass ich brauche, um blockieren der UI, bis und es sei denn, ich beende die Arbeit im hintergrund.
- Aber wenn es mehrere Dispatcher.Invoke/BeginInvoke verwendet wird, in der gesamten Applikation dann werden alle laufen im Main thread ?
- Nein, Sie verhindern den Zugriff mit der IsEnabled-Eigenschaft. Die Blockierung der ui-thread erzeugt nur deadlock.
- Passant: Du meinst IsEnabled-Eigenschaft des UI-Steuerelement ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dispatcher.Invoke
synchron ausgeführt auf dem gleichen thread wie Ihre Anwendung, was auch immer Sie also aufrufen, ist in der Lage zu blockieren, die Hauptanwendungs-thread.Dispatcher.BeginInvoke
wird asynchron ausgeführt, so dass es nicht zu binden, die Hauptanwendungs-thread während der Ausführung.Da Sie über
DispatcherPriority.Send
, das ist der höchste dispatcher Priorität, was auch immer Sie aufrufen ausgeführt wird, bevor alles andere, einschließlich der Erbringung der Bildschirm oder das hören für Veranstaltungen. Ich würde empfehlen, die Umschaltung, die zuDispatcherPriority.Background
, die läuft mit einer niedrigeren Priorität als Render-und-Eingang. Sehen auf dieser Seite für eine Liste derDispatcherPriority
Ebenen und Ihre Reihenfolge der AusführungIch würde empfehlen, du schaust auf die Antwort gepostet hier
Dispatcher.Invoke
oderDispatcher.BeginInvoke
führt auf dem Haupt-thread. Der Unterschied ist, dassBeginInvoke
nicht blockieren der thread, der nennt es.BeginInvoke
tut, ist, dass es plant, den code für die Ausführung auf dem Haupt-thread und dann sofort zurück. Also es blockiert nicht den thread, der es nennt. Aber wenn es eine lange Berechnung oder alles, was Blöcke in die delegieren, dann ist es blockiert den main thread.Dispatcher
: zum ausführen von code auf dem Haupt-thread.Control.(Begin)Invoke
, aber die situation mitDispatcher
ist sehr ähnlich.