2016-09-11 8 views
0

最初に、私はすでにthis postthisthisを読みましたが、それらのどれも私の問題を解決していないようです。WPF ProgressBarを呼び出されたアクションから更新する

を簡単に説明、私は、呼び出されたアクション内で複数回呼ばれているアンマネージDLL、すなわち

var d = new List<string>(); 
var myData = new StringBuilder(); 

this.Dispatcher.Invoke(new Action(() => 
{ 
    myDLL.GetDataFromIndex(2, myData); 
    d.Add(myData.ToString()); 

    myDLL.GetDataFromIndex(3, myData); 
    d.Add(myData.ToString()); 

    myDLL.GetDataFromIndex(4, myData); 
    d.Add(myData.ToString()); 

    //.... 
} 
    ), System.Windows.Threading.DispatcherPriority.ContextIdle); 

を持っている私はProgressBarによってデータを取得の進捗状況を表示したいです。まず、私は、それは明らかに動作しませんでしたし、それがまたmyDLL通話を台無しにした各d.Add(...)

pbStatus.Value = newValue; 

後に次の行を入れてProgressBar右後の各DLLの呼び出しを更新しようとしました。その後、ProgressBarBackgroundWorkerで更新する必要があることがわかりましたが、呼び出されたアクション内に新しいBackgroundWorkerを定義することができませんでした。さらに、DLL呼び出しには異なる時間がかかります。たとえば、GetDataFromIndex(2, ...)の後では、プロセスの20%が完了し、次のインデックスはそれぞれ5〜10%をとります。各DLL呼び出しの直後にProgressBarを更新する方法がわかりません。何かのヒントや回避策は何時間も無駄なグーグルからの疲れのために非常に高く評価されるだろう。

+0

これは意味がありませんでしたか?例外がスローされましたか?ビジュアルアップデートはありませんか?どのようにあなたのDLLの呼び出しを台無しにすることができますか? Debug.WriteLineを使用してVisual Studioの出力タブに項目を出力し、呼び出されたアクションがどこで終了するかを確認します。コード内の各コード行の後にそのような出力行を置いて、終了する部分を確認します。 –

+0

@MichalHaincなぜなら、DLLを持たないと無駄だったからです。そして私はその問題をできるだけ明確に述べました。 dllの呼び出しを台無しにすると、dllは前に正しいデータを得ていますが、それは奇妙なことです。そして例外はありませんでした –

答えて

1

ディスパッチャのアクションは、UIスレッドで実行されます。だからあなたのコードデザインは、あなたがそこでいくつかの外部呼び出しを行っていることを、その時点では悪いことです。 PINVOKINGをバックグラウンドタスク/スレッドに移動し、dispatcher.invokeを呼び出してバックグラウンドスレッドからプログレスバーの進捗状況を設定します。

私は約束したとおり、このgithubリポジトリを作成してprogressbar &バックグラウンドタスクの操作方法をデモンストレーションしました。これはWPFであり、MVVMパターンに従おうとしました。

https://github.com/michalhainc/ProgressBarMVVMDemo

+0

私はそれにあります。しかし、あなたはこれについて確かですか? –

+0

問題の原因はわかりませんが、とにかく設計上の問題です –

+0

問題は解決しませんでしたが、とにかく+1 –

関連する問題