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).
InformationsquelleAutor kris | 2010-11-30
Schreibe einen Kommentar