2017-10-19 27 views
-1

我不確定invoke是否正確使用它。它工作正常,但我想知道如果我應該使用invoke或其他方式來更新gui控件?如果我想報告更多的1個GUI控件?我怎樣才能更新listView或標籤和報告backgroundworker進度更改而不使用invoke?

現在我正在使用invoke更新label2和listView控件。 什麼時候應該使用invoke,何時不使用,然後如何更新這個gui控件而不用調用?

private string pathtosearch; 
private int countfiles; 

public Form1() 
{ 
    InitializeComponent(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    DirSearch(pathtosearch); 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
} 

void DirSearch(string sDir) 
{ 
    try 
    { 
     foreach (string d in Directory.GetDirectories(sDir)) 
     { 
      foreach (string f in Directory.GetFiles(d)) 
      { 
       Invoke((MethodInvoker)delegate 
       { 
        countfiles += 1; 
        label2.Text = countfiles.ToString(); 
       }); 
      } 
      DirSearch(d); 
     } 
    } 
    catch (System.Exception excpt) 
    { 
     Invoke((MethodInvoker)delegate 
     { 
      ListViewCostumControl.lvnf.Items.Add(excpt.Message); 
     }); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    DialogResult result = folderBrowserDialog1.ShowDialog(); 
    if (result == DialogResult.OK) 
    { 
     label1.Text = folderBrowserDialog1.SelectedPath; 
     pathtosearch = folderBrowserDialog1.SelectedPath; 
    } 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    if (textBox1.TextLength > 0) 
     backgroundWorker1.RunWorkerAsync(); 
} 

回答

0

使用ReportProgress方法發送信息給用戶界面和ProgressChanged事件來處理該消息。

private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) 
{ 
    var ex = e.UserState as Exception; 
    if(ex!= null) 
     ListViewCostumControl.lvnf.Items.Add(ex.Message); 
    else 
     label2.Text = e.ProgressPercentage.ToString();; 
} 


void DirSearch(string sDir) 
{ 
    try 
    { 
     foreach (string d in Directory.GetDirectories(sDir)) 
     { 
      foreach (string f in Directory.GetFiles(d)) 
       backgroundWorker1.ReportProgress(countfiles++); 

      DirSearch(d); 
     } 
    } 
    catch (System.Exception excpt) 
    { 
     backgroundWorker1.ReportProgress(countfiles, excpt); 
    } 
} 

ReportProgress可以用兩個參數重載:一個數字來報告簡單「進步」,稱爲類型的對象的UserData一個thesecond。如果你想發送信息豐富,插入這種說法您的自定義對象或任何其他現有的具有所需性能,並在另一邊 - 在ProgressChanged事件,再次「投」,它爲適當的類型,例如:

ReportProgress

backgroundWorker1.ReportProgress(countfiles, Tuple.Create(currFile, "Copying...", timeRem)); 

ProgressChanged事件:

var data = e.UserState as Tuple<string, string, TimeSpan>; 
相關問題