2016-11-29 19 views
0

ファイルの一部をpolylineにインポートするプログラムを作成しました。その後、wpf polyline要素でいくつかのシフト作業を実行する必要があります。当初、私は1回の反復を行いました。計算中のGuiのブロックは問題ありませんでした。しかし、私は多くのシフト反復を行う場合、GUIはしばらくブロックされています。したがって、問題を解決するBackgroundWorkerを追加しました。私のプログラムの構造は、ここで見ることができます:私のpolyline要素はMainGuiにすでに属しているので、それはSystem.InvalidOperationExceptionを投げるのスレッドBackgroundWorkerでwpf GUIオブジェクトを編集

  1. 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. 
    }); 
    
  2. は、各反復の後、私は私のキャンバス上polylinesを更新したいと思いますが、残念ながらこれは、ATM機能していません。また私のProgressBarは反復の終わりまで更新されません。この問題を解決する方法はありますか?私はMVVMパターンで私の問題を解決することができるよかどうかを確認するために、短いexcurseを作った後

+0

私は通常、オブジェクトをコンストラクタのbackgroundworkerに渡します。 Progressイベントを登録しましたか?新しいProgressChangedEventHandler(worker_ProgressChanged); – jdweng

+0

はい、これも試しました。疑似コードを編集して明確にしました。 Thx – Nindalf

+0

どこでもWPFオブジェクトを渡すべきではなく、代わりにビューモデルオブジェクトを渡す必要があります – MikeT

答えて

0

は、私は私が私のプログラムで実装し、それは私にあまりにも長い間を取るためにMVVMがあまりにもハードであることを決定しました。だから私は見つけた、あなたに見せたい別の解決策を探しました。

対処:

IはList<List<Point>>polyline素子に対して平行に実装しました。私はリスト内のポイント上のすべてのシフト作業を実行します。BackgroundWorkerで私のGuiを更新したいときは、メインスレッドにこのタスク(最初の記事のコードを参照)を送り、foreachpolylineのポイントを上書きします。今や私のInterfaceは反応していて、繰り返しのステップごとに私はGuiを更新できます。このように私は両方の問題を解決しました。

関連する問題