我正在开发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版本的依赖

任何帮助,将不胜感激。

谢谢

卡皮尔

有帮助吗?

解决方案

WPF课程中有相当多的通量。注意底部的“支持”注释 MSDN库文章 对于此方法。您需要至少在该机器上安装.NET 3.0 SP1,这是与.NET 3.5同时释放的服务包。

没有一个好的检查方法,[汇编]没有改变。这是通过依赖Windows Update自动升级.NET版本的Windows更新来进行的。如果您的客户阻止了这些更新,则必须设置已安装了原始.NET 3.0版本的测试计算机。

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

其他提示

试试这个:

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没有超载来转换其实际类型。其次,用户的计算机被丢弃,需要良好的清洁(擦除,重新安装)。第三,您的问题在其他地方,您 思考 这是您得到例外的地方,但实际上它在其他地方。

发现我使用的方法在.NET版本3.0中不支持(仅在.NET 3.0SP2中支持)

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

因此,既然我正在使用另一种超载的Invoke方法,该方法在.NET 3.0中正常工作,我可以解决此问题。

谢谢,卡皮尔

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top