2010-05-24 64 views
2

我正在开发一个WPF Windows应用程序,并且遇到了运行.NET 3.0中的应用程序的麻烦。每次尝试访问System.Windows.Threading.Dispatcher.Invoke()方法时,都会收到方法未找到的错误。Dispatcher.Invoke在.NET 3.0 SP1中不起作用

基本上,我产卵从主线程一个新线程,使用下面的代码来自新线程尝试改变一些UI属性(基本上更新进度条):

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的版本有所依赖

任何帮助,将不胜感激。

感谢

卡皮尔

回答

2

WPF类中存在相当多的流量。请注意此方法的MSDN Library article底部的“Supported in”注释。您至少需要在该计算机上安装.NET 3.0 SP1,这是与.NET 3.5同时发布的服务包。

有没有好的方法来检查这个,[AssemblyVersion]没有改变。这是通过依靠Windows Update自动升级.NET版本来实现的。如果您的客户阻止了这些更新,那么您将不得不安装安装了原始.NET 3.0版本的测试机器。

解决方法非常简单,一旦找到它们,就可以使用3.0 RTM中提供的重载。要求客户部署3.5 SP1是明智的。

+0

谢谢,我发现我使用的API不应该在.net 3.0上运行 – Kapil 2010-05-25 11:17:42

1

试试这个:

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

调用不是一个静态方法。你必须在类的一个实例上调用它。您可以使用静态属性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没有重载来转换它的实际类型。其次,用户的电脑被丢弃,需要清洁(擦拭,重新安装)。第三,你的问题在别处,而你认为这是你得到例外的地方,但实际上它在别的地方。

+0

意志,每DispatcherObject的(一个窗口是一个DispatcherObject的)的调度属性,它使System.Windows.Threading.Dispatcher的实例)。它在我的代码中引用的这个Dispatcher属性。 对不起,在我的文章中没有说清楚。但是,您的解决方案不会帮助我超越未发现的异常。 我已经测试了.net 3.0 sp2 env中的应用程序,它工作得很好 – Kapil 2010-05-24 12:44:17

+0

@Kapil会更新,但很难猜测,因为您没有提供任何有关找不到方法的信息。我正在尝试复制(午餐晚餐)。 – Will 2010-05-24 17:59:15

+0

@Kapil究竟是'perc'的类型? – Will 2010-05-24 17:59:47