题
我正在开发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中正常工作,我可以解决此问题。
谢谢,卡皮尔