Pregunta

Estoy desarrollando un uso de las ventanas de WPF y estoy metiendo en un problemas para ejecutar la aplicación en .NET 3.0. Cada vez que intento acceder al método System.Windows.Threading.Dispatcher.Invoke (), me sale un error de método no encontrado.

Básicamente, generar un nuevo subproceso desde el hilo principal y tratar de cambiar algunas propiedades de la interfaz de usuario (actualizar básicamente una barra de progreso) del nuevo hilo usando el siguiente código:

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

Puede alguien ayuda a entender por qué me encuentro con este error en .NET versión 3.0? Soy capaz de conseguir esto va en .NET 3.0 SP2. Pero supongo .NET no se distribuye de forma independiente y se empaqueta únicamente con .NET versión 3.5. Mi objetivo es conseguir acabar con la dependencia de .NET 3.5 y tienen una dependencia en .NET versión 3.0

Cualquier ayuda sería apreciada.

Gracias

Kapil

¿Fue útil?

Solución

Ha habido una buena cantidad de flujo en las clases de WPF. Tenga en cuenta el "Apoyado en" anotación en la parte inferior de la el artículo de MSDN para este método. Usted necesita tener al menos .NET 3.0 SP1 instalado en esa máquina, el paquete de servicio que fue lanzado al mismo tiempo que .NET 3.5.

No hay una buena forma de comprobar esto, el [AssemblyVersion] no cambió. Esto fue empapelada-sobre apoyándose en Windows Update actualizar automáticamente la versión .NET. Si sus clientes bloques estas actualizaciones, entonces tendrán que configurar una máquina de prueba que tiene el .NET originales instalado versión 3.0.

La solución es bastante simple, una vez que los encuentra, utilice una sobrecarga que está disponible en 3.0 RTM. Preguntar al cliente para desplegar 3.5 SP1 sería prudente.

Otros consejos

Prueba esto:

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

Invoke no es un método estático. Debe llamar en una instancia de la clase. Puede utilizar la propiedad estática Dispatcher.CurrentDispatcher para obtener (o crear) el despachador asociado con el subproceso actual.

(Por cierto, usted es incorrecta de que esto iba a funcionar con una versión diferente de la estructura.)


Me he tomado el siguiente programa (todos 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);

y han ejecutarlo focalización 3.0, 3.5 (SP1) y 4.0. Funciona en cada versión.

Esto me lleva a tres conclusiones. En primer lugar, perc no puede ser una cadena y Convert.ToDouble no tiene una sobrecarga para convertir el tipo que realmente es. En segundo lugar, el equipo del usuario está destrozada y necesita una limpieza buena (limpiar, vuelva a instalar). En tercer lugar, el problema está en otra parte y que pensar es aquí donde se está recibiendo la excepción, pero en realidad está en otra parte.

dimos cuenta de que el método que estaba usando no fue apoyado en .NET versión 3.0 (sólo está soportado en .NET 3.0SP2 en adelante)

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

Así que, ahora que estoy usando otro método sobrecargado de invocación que funciona muy bien en .NET 3.0, soy capaz de resolver este problema.

Gracias, Kapil

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top