質問

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で正常に機能する別の過負荷の呼び出し方法を使用しているので、この問題を解決することができます。

ありがとう、カピル

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top