我正在开发一个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版本
任何帮助都将不胜感激。
由于
卡皮尔西
答案 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中工作正常,我就能解决这个问题。
谢谢, 卡皮尔