Dispatcher.Invoke在.NET 3.0 SP1中不起作用

时间:2010-05-24 11:53:51

标签: c# .net-3.0

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

基本上,我从主线程生成一个新线程,并尝试使用以下代码从新线程更改一些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版本

任何帮助都将不胜感激。

由于

卡皮尔西

3 个答案:

答案 0 :(得分:2)

WPF课程中有相当多的变化。请注意此方法MSDN Library article底部的“支持”注释。您需要在该计算机上安装至少.NET 3.0 SP1,该服务包与.NET 3.5同时发布。

没有好办法检查这个,[AssemblyVersion]没有改变。这是通过依赖Windows Update自动升级.NET版本来实现的。如果您的客户阻止了这些更新,那么您将必须设置一台安装了原始.NET 3.0版本的测试计算机。

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

答案 1 :(得分:1)

试试这个:

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没有重载来转换它实际的类型。其次,用户的计算机被破坏并需要良好的清洁(擦除,重新安装)。第三,你的问题在其他地方,你认为这是你获得异常的地方,但实际上它在其他地方。

答案 2 :(得分:1)

想出我使用的方法在.net 3.0版中不受支持(仅在.net 3.0sp2之后支持)

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

所以,既然我正在使用另一个重载的Invoke方法,它在.net 3.0中工作正常,我就能解决这个问题。

谢谢, 卡皮尔