ファイルの一部をpolyline
にインポートするプログラムを作成しました。その後、wpf polyline
要素でいくつかのシフト作業を実行する必要があります。当初、私は1回の反復を行いました。計算中のGuiのブロックは問題ありませんでした。しかし、私は多くのシフト反復を行う場合、GUIはしばらくブロックされています。したがって、問題を解決するBackgroundWorker
を追加しました。私のプログラムの構造は、ここで見ることができます:私のpolyline
要素はMainGuiにすでに属しているので、それはSystem.InvalidOperationException
を投げるのスレッドBackgroundWorkerでwpf GUIオブジェクトを編集
:
class MainGui { private readonly BackgroundWorker worker = new BackgroundWorker(); List<Polyline> _lines; int _iterationCount = 10; public MainGui() { worker.DoWork += worker_DoWork; worker.WorkerReportsProgress = true; worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); } public void MainTask() { _lines = Import.ImportLines(); DrawLines(_lines); } private void button_Click(object sender, RoutedEventArgs e) { worker.RunWorkerAsync(); } private void worker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < _iterationCount; i++) { ShiftTask.DoShift(_lines); // worker.ReportProgress((int)((_workerProgressBase - _overlFid[0].Count)/_workerProgressBase * 100)); (sender as BackgroundWorker).ReportProgress((int)((_iterationCount - i)/_iterationCount * 100)); // here I would like to update my canvas } } private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { ProgressBar.Value = e.ProgressPercentage; } private void DrawLines(List<Polyline> lines) { // draw lines on wpf canvas } }
は、私が今、二つの問題があります。私は
Dispatcher
で解決しようとしました。しかし、このコードを追加すると、私のGUIは再びブロックされます。被参照オブジェクトpolyline
を作業者に渡すための良い方法は何ですか?this.Dispatcher.Invoke(() => { ...// your code here. });
は、各反復の後、私は私のキャンバス上
polylines
を更新したいと思いますが、残念ながらこれは、ATM機能していません。また私のProgressBar
は反復の終わりまで更新されません。この問題を解決する方法はありますか?私はMVVMパターンで私の問題を解決することができるよかどうかを確認するために、短いexcurseを作った後
私は通常、オブジェクトをコンストラクタのbackgroundworkerに渡します。 Progressイベントを登録しましたか?新しいProgressChangedEventHandler(worker_ProgressChanged); – jdweng
はい、これも試しました。疑似コードを編集して明確にしました。 Thx – Nindalf
どこでもWPFオブジェクトを渡すべきではなく、代わりにビューモデルオブジェクトを渡す必要があります – MikeT