2017-01-22 8 views
0

現在、テキストファイルを読み込み、その中のすべての電子メールアドレスを抽出しようとしています。この次の関数で作業ガット:C#関数が実行されているときにプログレスバーを入力する

私のC#の機能:ロードされたテキストファイルが巨大なことができるので、

public void extractMails(string filePath) 
{ 
    List<string> mailAddressList = new List<string>(); 

    string data = File.ReadAllText(filePath); 
    Regex emailRegex = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", RegexOptions.IgnoreCase); 
    MatchCollection emailMatches = emailRegex.Matches(data); 

    StringBuilder sb = new StringBuilder(); 

    foreach (Match emailMatch in emailMatches) 
    { 
     sb.AppendLine(emailMatch.Value); 
    } 

    string exePath = System.Reflection.Assembly.GetEntryAssembly().Location; 
    string dirPath = Path.GetDirectoryName(exePath); 

    File.WriteAllText(dirPath + "extractedEmails.txt", sb.ToString()); 
} 

今私は、プログレスバーを追加しました。プログレスバーが最後に100%に満たされるように関数が実行されている間に、どのようにプログレスバーを塗りつぶすことができますか?

私は何か助けに感謝します。

+0

、あなたは大きなファイルのためのベストプラクティスである行毎にファイルを読み込み、async-を使用するために、 'ReadLines'と' ReadAllText'を交換する必要がBackgroundWorkerの –

+1

を使用長い実行コードを同期して実行するためのパターンを待ちます。 – user3185569

+0

はいwinformアプリケーション – d45ndx

答えて

0

@ user3185569コメントは正しいです。私はasyncまたはawaitを使用せずに、別の種類のソリューションを提供しています。旧バージョンのVisual Studioを使用している場合に備えてです。

基本的には、新しいスレッドでタスクをスピンアップしてから、Invoke()を使用してプログレスバーを更新する必要があります。ここでは簡単な例です:WinFormsのを想定し

private int _progress; 
private delegate void Delegate(); 

private void btnStartTask_Click(object sender, EventArgs e) 
{ 
    // Initialize progress bar to 0 and task a new task 
    _progress = 0; 
    progressBar1.Value = 0; 
    Task.Factory.StartNew(DoTask); 
} 

private void DoTask() 
{ 
    // Simulate a long 5 second task 
    // Obviously you'll replace this with your own task 
    for (int i = 0; i < 5; i++) 
    { 
     System.Threading.Thread.Sleep(1000); 
     _progress = (i + 1)*20; 
     if (progressBar1.InvokeRequired) 
     { 
      var myDelegate = new Delegate(UpdateProgressBar); 
      progressBar1.Invoke(myDelegate); 
     } 
     else 
     { 
      UpdateProgressBar(); 
     } 
    } 
} 

private void UpdateProgressBar() 
{ 
    progressBar1.Value = _progress; 
} 
0

ファイル内のすべてのオブジェクトを反復処理するだけです。そこにオブジェクトの量が必要です。次に、現在のイテレーターにオブジェクトの合計量を100で掛けます。あなたのpersentageをTheres。バーのプロセスを取得した値で更新します。

関連する問題