Dispatcher.Invoke .NET 3.0 SP1で動作していません
質問
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.5と同時にリリースされたサービスパックであるそのマシンに、少なくとも.NET 3.0 SP1をインストールする必要があります。
これを確認する良い方法はありません。[AssemblyVersion]は変わりませんでした。これは、.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) });
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をターゲットにして実行しました。各バージョンで動作します。
これにより、3つの結論に至ります。まず、Percは文字列であり、変換されない場合があります。todoubleには、実際にあるタイプを変換するための過負荷がありません。第二に、ユーザーのコンピューターは破壊されており、適切なクリーニングが必要です(ワイプ、再インストール)。第三に、あなたの問題は他の場所とあなたです 考える これはあなたが例外を取得しているところですが、実際にはどこか別の場所です。
私が使用していた方法は.NETバージョン3.0ではサポートされていないことがわかりました(.NET 3.0SP2以降のみサポートされています)
http://msdn.microsoft.com/en-us/library/cc647499%28vs.90%29.aspx
したがって、.NET 3.0で正常に機能する別の過負荷の呼び出し方法を使用しているので、この問題を解決することができます。
ありがとう、カピル