Domanda

Sto sviluppando un'applicazione Windows WPF e sto ottenendo in un guaio in esecuzione l'applicazione in .NET 3.0. Ogni volta che provo ad accedere al metodo System.Windows.Threading.Dispatcher.Invoke (), ottengo un errore di metodo-not-found.

Fondamentalmente, ho generare un nuovo filo dal filo principale e cercare di modificare alcune proprietà UI (fondamentalmente aggiornare un avanzamento-bar) dal nuovo thread utilizzando il seguente codice:

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

può aiutare qualcuno a capire il motivo per cui faccio verifica questo errore nella versione di .NET 3.0? Sono in grado di ottenere questo andare in .NET 3.0 SP2. Ma credo che .NET non è distribuito in modo indipendente ed è confezionato solo con .NET versione 3.5. Il mio obiettivo è quello di farla franca con la dipendenza di .NET 3.5 e hanno una dipendenza sul .NET versione 3.0

Qualsiasi aiuto sarebbe apprezzato.

Grazie

Kapil

È stato utile?

Soluzione

C'è stata una discreta quantità di flusso nelle classi WPF. Nota il "Supportato in" annotazione sul fondo del articolo MSDN Library per questo metodo. Avrete bisogno di avere almeno .NET 3.0 SP1 installato su quella macchina, il service pack che è stato rilasciato allo stesso tempo come .NET 3.5.

Non v'è alcun buon modo per verificare la presenza di questo, il [AssemblyVersion] non è cambiata. Questo è stato tappezzata-over facendo affidamento su Windows Update l'aggiornamento automaticamente la versione di .NET. Se i blocchi dei clienti questi aggiornamenti, allora dovrete impostare una macchina di prova dotato di .NET originale versione 3.0 installato.

La soluzione è abbastanza semplice, una volta trovato li, utilizzare un sovraccarico che è disponibile in 3.0 RTM. Chiedere al cliente di implementare 3.5 SP1 sarebbe saggio.

Altri suggerimenti

Prova questo:

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

Invoke non è un metodo statico. È necessario chiamare in un'istanza della classe. È possibile utilizzare la proprietà statica Dispatcher.CurrentDispatcher per ottenere (o creare) il dispatcher associato al thread corrente.

(a proposito, si è errata che questo dovrebbe funzionare con una versione diversa del quadro.)


Ho preso il seguente programma (tutti in MainWindow.xaml.cs):

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);

e hanno eseguirlo mira 3.0, 3.5 (SP1) e 4.0. Funziona su ogni versione.

Questo mi porta a tre conclusioni. In primo luogo, perc potrebbe non essere una stringa e Convert.ToDouble non ha un sovraccarico per convertire il tipo non sia in realtà. In secondo luogo, il computer dell'utente si guasti e ha bisogno di una pulizia buona (wipe, reinstallazione). In terzo luogo, il problema è altrove e si pensare è qui che stai ricevendo l'eccezione, ma in realtà è da qualche altra parte.

capito che il metodo stavo usando non è stato supportato in .NET versione 3.0 (supportato solamente in .net 3.0SP2 poi)

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

Così, ora che sto utilizzando un altro metodo di overload di Invoke, che funziona bene in .NET 3.0, sono in grado di risolvere questo problema.

Grazie, Kapil

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top