Попробуйте это:
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 не имеет перегрузки для преобразования типа, которым он на самом деле является. Во-вторых, компьютер пользователя перегружен и нуждается в хорошей очистке (стирание, переустановка). В-третьих, ваша проблема в другом месте, и вы думаете именно здесь вы получаете исключение, но на самом деле это где-то еще.