Question

Je développe une application Windows WPF et je suis entrer dans une des difficultés à exécuter l'application dans .NET 3.0. A chaque fois que je tente d'accéder à la méthode System.Windows.Threading.Dispatcher.Invoke (), je reçois une erreur de méthode non trouvée.

En fait, je fraient un nouveau fil du thread principal et essayer de changer certaines propriétés de l'interface utilisateur (mise à jour essentiellement une barre de progression) du nouveau thread en utilisant le code suivant:

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

aide quelqu'un peut me comprendre pourquoi dois-je rencontrer cette erreur dans la version .NET 3.0? Je suis en mesure d'obtenir dans le Service Pack 2 cela va .NET 3.0. Mais je suppose que .NET n'est pas distribué et est emballé indépendamment seulement avec la version .NET 3.5. Mon but est de sortir avec la dépendance de .net 3.5 et ont une dépendance sur la version .NET 3.0

Toute aide serait appréciée.

Merci

Kapil

Était-ce utile?

La solution

Il y a eu une quantité juste de flux dans les classes de WPF. Notez le « pris en charge dans » l'annotation en bas de la article MSDN Library pour cette méthode. Vous aurez besoin d'avoir au moins .NET 3.0 SP1 installé sur cette machine, le service pack qui a été libéré en même temps que .NET 3.5.

Il n'y a pas de bonne façon de vérifier cela, le [AssemblyVersion] n'a pas changé. Cela a été tapissée-dessus en se basant sur la mise à niveau Windows Update automatiquement la version .NET. Si vos blocs clients ces mises à jour alors vous devez configurer une machine de test qui a la version .NET 3.0 d'origine installé.

La solution est assez simple, une fois que vous les trouverez, utilisez une surcharge qui est disponible dans la version 3.0 RTM. Demander au client de déployer 3.5 SP1 serait sage.

Autres conseils

Essayez ceci:

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

Invoke est pas une méthode statique. Vous devez l'appeler sur une instance de la classe. Vous pouvez utiliser la propriété statique Dispatcher.CurrentDispatcher pour obtenir (ou créer) le répartiteur associé au thread courant.

(BTW, vous avez tort que cela fonctionnerait avec une version différente du cadre.)


J'ai pris le programme suivant (tous en 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);

et ont exécuter le ciblage 3.0, 3.5 (sp1) et 4.0. Il fonctionne sur chaque version.

Cela conduit à me trois conclusions. Tout d'abord, perc ne peut pas être une chaîne et Convert.ToDouble ne dispose pas d'une surcharge pour convertir le type, il est en réalité. En second lieu, l'ordinateur de l'utilisateur est saccagé et a besoin d'un bon nettoyage (essuyer, reinstall). Troisièmement, votre problème est ailleurs et vous pense c'est là que vous obtenez l'exception, mais en fait, il est ailleurs.

Figured que la méthode que j'utilisais n'a pas été pris en charge dans la version .net 3.0 (supporté seulement .net 3.0SP2 partir)

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

Alors, maintenant que je suis en utilisant une autre méthode surchargée de Invoke qui fonctionne très bien dans .net 3.0, je suis en mesure de résoudre ce problème.

Merci, Kapil

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top