Frage

Ich entwickle eine WPF-Windows-Anwendung und bin immer in ein Problem laufen die App in .NET 3.0. Jedes Mal, dass ich versuche, die System.Windows.Threading.Dispatcher.Invoke () -Methode zugreifen, erhalte ich eine Methode nicht gefunden-Fehler.

Im Grunde ist Laichen einen neuen Thread aus dem Haupt-Thread und versuche, einige UI-Eigenschaften zu ändern (im Grunde einen Fortschrittsbalken aktualisieren) aus dem neuen Thread mit dem folgenden Code:

updateStatusDelegate usd = new updateStatusDelegate(progressBar.SetValue);
Dispatcher.Invoke(usd, System.Windows.Threading.DispatcherPriority.Background, new object[] { System.Windows.Controls.ProgressBar.ValueProperty, Convert.ToDouble(perc) });

Kann jemand mir helfen, zu verstehen, warum sie begegne ich diesen Fehler in .NET 3.0-Version? Ich bin in der Lage dies in .NET 3.0 SP2 in Gang zu bringen. Aber ich denke, .NET nicht selbstständig verteilt wird und verpackt ist nur mit .NET 3.5-Version. Mein Ziel ist es mit der Abhängung von .net 3.5 wegzukommen und eine Abhängung auf .NET Version 3.0

Jede mögliche Hilfe würde geschätzt.

Danke

Kapil

War es hilfreich?

Lösung

Es gibt eine ganze Menge Fluss in den WPF-Klassen gewesen. die „Unterstützt in“ Anmerkung Hinweis am Ende des MSDN Library-Artikel für diese Methode. Sie werden zumindest auf dieser Maschine installiert .NET 3.0 SP1 haben müssen, der Service Pack, das zur gleichen Zeit wie .NET 3.5 veröffentlicht wurde.

Es gibt keine gute Möglichkeit für das zu überprüfen, die [Assembly] nicht ändern. Dies wurde unter Berufung auf Windows Update tapeziert-over automatisch die .NET-Version zu aktualisieren. Wenn Ihr Kunde blockiert diese Updates dann werden Sie eine Testmaschine zu installieren, die die ursprünglichen .NET 3.0-Version installiert ist.

Die Abhilfe ist einfach genug, wenn man sie finden, eine Überlastung verwenden, die in 3.0 RTM verfügbar ist. den Kunden fragen, 3.5 SP1 bereitstellen wäre klug.

Andere Tipps

Versuchen Sie diese:

updateStatusDelegate usd = new updateStatusDelegate(progressBar.SetValue);
Dispatcher.CurrentDispatcher.Invoke(
    usd, 
    DispatcherPriority.Background, 
    new object[] { ProgressBar.ValueProperty, Convert.ToDouble(perc) });

Invoke ist kein statisches Verfahren. Sie müssen es auf eine Instanz der Klasse aufrufen. Sie können die statische Eigenschaft verwenden Dispatcher.CurrentDispatcher zu bekommen (oder erstellen) den Dispatcher mit dem aktuellen Thread zugeordnet ist.

(BTW, sind Sie falsch, dass diese mit einer anderen Version des Frameworks funktionieren würden.)


Ich habe das folgende Programm (alle in MainWindow.xaml.cs) genommen:

public partial class MainWindow : Window
{
    private string perc = ".25";

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        updateStatusDelegate usd = new updateStatusDelegate(
            progressBar.SetValue);
        Dispatcher.Invoke(usd, 
            System.Windows.Threading.DispatcherPriority.Background, 
            new object[] { 
                System.Windows.Controls.ProgressBar.ValueProperty, 
                Convert.ToDouble(perc) });

        var dbl = Convert.ToDouble(perc);
        perc = (dbl + .1).ToString();
    }
}
public delegate void updateStatusDelegate(DependencyProperty dp, object value);

und hat es laufen 3.0, 3.5 (SP1) und 4.0-Targeting. Es funktioniert auf jeder Version.

Dies führt mich zu drei Schlussfolgerungen. Erstens, perc kann kein String sein und Convert.ToDouble nicht über eine Überlastung der Typ zu konvertieren es tatsächlich ist. Zweitens wird der Computer des Benutzers im Papierkorb und braucht eine gute Reinigung (wischt, wieder installieren). Drittens Ihr Problem ist anderswo und Sie denken das ist, wo Sie die Ausnahme sind immer, aber in Wirklichkeit ist es woanders.

herausgefunden, dass das Verfahren war ich mit in .net-Version 3.0 (nur in .net 3.0sp2 weiter unterstützt) nicht unterstützt

http://msdn.microsoft.com /en-us/library/cc647499%28VS.90%29.aspx

So, jetzt, dass ich eine andere überladene Methode von Invoke bin mit der gut arbeitet in .net 3.0, ich bin in der Lage, dieses Problem zu lösen.

Danke, Kapil

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top