2017-01-05 3 views
1

別のアセンブリを参照するWPFプロジェクトがあります。参照アセンブリでは、テキストファイルからいくつかのデータを抽出するクラスを持っています。ファイルを行単位で読み込むことができるので、行全体と行全体を比較することで、完了率を計算することができます。参照アセンブリで実行されているタスクから進行状況を表示

WPFアプリケーションでは、進行状況を保存するために、進行状況バーとViewModelプロパティへのデータバインディングを作成しました。

外部アセンブリから進行状況を取得して、進行状況バー 'ビュー'がUIで更新されるようにViewModelプロパティを更新するにはどうすればよいですか?

BTW:参照されているアセンブリで、ソースにアクセスでき、コードを変更/追加できます。すべてが.NET 4.5以上です。

+0

どのように外部のアセンブリは、その進捗状況を報告しますか? – Clint

+1

@Clintそれはまだ、私はどのようにUI側にそれを伝えるか分からない。私はそれを計算することができますが、その後の値をどうしたらいいのかわかりません。 – erotavlas

答えて

1

あなたの編集を1として、あなたが他のアセンブリ内のコードに変更を加えることができます説明し、私は私がする部分だアプローチのために行くお勧めします:もちろん

// This would be in the external assembly 
public MyReturnValue ProcessFile(Action<double> progressDelegate) 
{ 
    foreach(var line in file) 
    { 
     progressDelegate?.Invoke(myCalculatedProgress) 
    } 
} 

// This would be in the app 

var progDelegate = new Action<double>((progress) => ViewModel.Progress = progress); 
ExternalLibrary.ProcessFile(progDelegate); 

、これは私すぐにちょうど何かであります一緒に投げて、あなたのプロジェクトに適応する必要がありますが、これは私がかなり大きなWPFプロジェクトで以前の雇用主で使用していたものであり、かなりうまく機能しました。

アップデートをUIスレッドにディスパッチするなどの通常の疑いのあるものはすべて処理する必要がありますが、それはすべてかなり標準的です。

また、IProgressインターフェイスを使用して、実際のオブジェクトの周りを渡して、これらのことを報告していました。これは特に、私たちが使用したグローバルIProgressスコープに何かが呼び出されたときにモーダルダイアログを表示するために使用されました。

+0

foreachのprogressDelegateの後に疑問符は何をするのですか?私はそれが誤字だと思った。 – erotavlas

+1

@erotavlasデリゲートがnullの場合、ヌル状態演算子です。 '.Invoke'を呼び出そうとしないので、' if(arg)== null'チェックを避けます。 – Clint

+0

また、UIを更新する際に問題があります。 、コードが動作していて、各変更時にviewmodel変数が更新されますが、UIはフリーズし、進行状況バーには値が表示されません(100%)。Dispatcherを使用して別のスレッド。何か案は? – erotavlas

2

IProgressのように聞こえます。

Hereは、その使用方法のサンプルです。

いくつかの擬似コード:

public void DoWorkWithFile(IProgress<double> progress) 
{ 
    var lines = File.ReadAllLines("path to a file"); 
    for (int i = 0; i < lines.Length; i++) 
    { 
     // do stuff with the line 
     progress.Report(100 * i/(double)lines.Length); 
    } 
} 

注もしそうなら、それは使用するべきではありませんので、ファイルが大きい場合ReadAllLinesは大量のメモリを消費すること。

代替ファイルの行数を知ることが起こる場合:

public async Task DoWorkWithFileAsync(IProgress<double> progress) 
{ 
    using (var reader = new StreamReader(File.OpenRead("path to a file"))) 
    { 
     var totalLines = (double)55; // Assuming you know it 
     var lineNo = 0; 
     string line; 
     while ((line = await reader.ReadLineAsync().ConfigureAwait(false)) != null) 
     { 
      // do stuff with the line 
      lineNo++; 
      progress.Report(100 * lineNo/totalLines); 
     } 
    } 
} 
関連する問題