Unterschied zwischen SendOrPostCallback und Action in einer multithreaded Umgebung?
Ich bin ziemlich neu in der Arbeit mit threads. Ich war versucht, einen DependencyProperty
's Wert:
public States State
{
get { return (States)GetValue(StateProperty); }
set
{
Dispatcher.BeginInvoke(DispatcherPriority.Background,
//(SendOrPostCallback)delegate { SetValue(StateProperty, value); }, //works
(Action)(()=> SetValue(StateProperty, value)), //doesnt
value);
}
}
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State", typeof(States), typeof(FTPDownload), new UIPropertyMetadata(States.Idle));
Erkannte ich die harte Weise, dass in den setter, die Sie verwenden müssen, SendOrPostCallback (da es als argument beim Aufruf der Methode). es funktioniert NICHT mit der Aktion (weil das fehlende argument. Und wpf ist wirklich eine Hündin über ihn, das Debuggen und das finden der Ursache der TargetParameterCountException mit "keine Quelle verfügbar" und keine Ahnung.
Warum muss ich SendOrPostCallback es? und wie soll ich wissen, dass in diesem Fall die richtige? Denn eigentlich aufrufen der setter funktioniert über:
Dispatcher.BeginInvoke((Action)(()=>State=States.Updating), null);
und mit der SendOrPostCallback stattdessen natürlich die Ergebnisse in einem TargetParameterCountException..
Nur Wundern, wenn scheinbar inkonsistent, so etwas nur gemeinsam sind wissen? Gefühl, ein bisschen hier verloren, zumindest da googeln, um mit SendOrPostCallback, Action und BeginInvoke als Schlüsselwörter hatte keine sinnvollen Ergebnisse.
- FYI, der setter für den Staat wird nicht aufgerufen, wenn das update kommt, als ein Ergebnis der Daten-Bindungs-system. Es wird call SetValue direkt. Als solcher ist dieser Ansatz für die Synchronisierung, funktionieren eventuell nicht wie erwartet. Die allgemein beste Praxis ist, um sicherzustellen, dass alle DP updates auftreten auf dem UI-thread, was bedeutet, isolieren das UI-Logik (ViewModel) von einem multi-threaded arbeiten, die in den zugrunde liegenden Daten und Logik (Modell).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den relevanten Informationen:
1.Die überlastung der
Dispatcher.BeginInvoke
, die Sie verwenden ist:method
: Einen Delegaten auf eine Methode , dass ein argument, die geschoben wird, ist auf der event Dispatcher queue.2.Die
SendOrPostCallBack
Delegat deklariert wird:3.Für
Action
:Klar, die
SendOrPostCallBack
delegieren kompatibel ist, da dauert es ein einziges argument, aberAction
ist das nicht, denn es ist parameterlosen.Natürlich können Sie die
Action - <T>
Delegierten, die hat nehmen ein einzelnes argument, wenn Sie es vorziehen:Alternativ können Sie eine verschiedene überlastung von
Dispatcher.BeginInvoke
erwartet ein argument, das ist eines Delegaten-Typs, der keine Argumente, und erhalten Sie den C# - compiler zu tun, die schmutzige Arbeit für Sie, die in der Schließung:Beachten Sie, dass
value
ist eine aufgenommene variable, also bitte vorsichtig sein.(Auch diese Antwort sich nicht mit jedem thread-Fragen der Sicherheit, nur um das delegieren von Unterschriften beteiligt.)