Диспетчер. Invoke не работает в .NET 3.0 SP1 - PullRequest
2 голосов
/ 24 мая 2010

Я занимаюсь разработкой приложения Windows WPF и столкнулся с проблемой запуска приложения в .NET 3.0. Каждый раз, когда я пытаюсь получить доступ к методу System.Windows.Threading.Dispatcher.Invoke (), я получаю сообщение об ошибке «метод не найден».

По сути, я создаю новый поток из основного потока и пытаюсь изменить некоторые свойства пользовательского интерфейса (в основном обновить индикатор выполнения) из нового потока, используя следующий код:

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

Может кто-нибудь помочь мне понять, почему я сталкиваюсь с этой ошибкой в ​​версии .NET 3.0? Я могу добиться этого в .NET 3.0 SP2. Но я полагаю, что .NET не распространяется независимо и поставляется только с версией .NET 3.5. Моя цель - избавиться от зависимости .net 3.5 и зависеть от версии .NET 3.0

Любая помощь будет оценена.

Спасибо

Капил

Ответы [ 3 ]

2 голосов
/ 24 мая 2010

В классах WPF было достаточно много изменений. Обратите внимание на аннотацию «Поддерживается в» внизу статьи библиотеки MSDN для этого метода. На этом компьютере должен быть установлен как минимум .NET 3.0 SP1, пакет обновления, выпущенный одновременно с .NET 3.5.

Нет хорошего способа проверить это, [AssemblyVersion] не изменилась. Это было скрыто благодаря автоматическому обновлению версии .NET на Центре обновления Windows. Если ваш клиент блокирует эти обновления, вам придется настроить тестовый компьютер, на котором установлен оригинальный выпуск .NET 3.0.

Обходной путь достаточно прост, как только вы их найдете, используйте перегрузку, доступную в 3.0 RTM. Было бы разумно попросить клиента развернуть 3.5 SP1.

1 голос
/ 25 мая 2010

Понял, что используемый мной метод не поддерживается в .net версии 3.0 (поддерживается только в .net 3.0sp2 и более поздних версиях)

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

Итак, теперь, когда я использую другой перегруженный метод Invoke, который отлично работает в .net 3.0, я могу решить эту проблему.

Спасибо, Капил

1 голос
/ 24 мая 2010

Попробуйте это:

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

Invoke не является статическим методом. Вы должны вызвать его в экземпляре класса. Вы можете использовать статическое свойство Dispatcher.CurrentDispatcher , чтобы получить (или создать) диспетчер, связанный с текущим потоком.

(Кстати, вы не правы, что это будет работать с другой версией фреймворка.)


Я взял следующую программу (все в 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);

и запустили его, нацеливаясь на 3.0, 3.5 (sp1) и 4.0. Работает на каждой версии.

Это приводит меня к трем выводам. Во-первых, perc не может быть строкой, и Convert.ToDouble не имеет перегрузки для преобразования типа, которым он на самом деле является. Во-вторых, компьютер пользователя перегружен и нуждается в хорошей очистке (стирание, переустановка). В-третьих, ваша проблема в другом месте, и вы думаете именно здесь вы получаете исключение, но на самом деле это где-то еще.

...