C# 如何更新listView或标签并向backgroundworker报告在不使用invoke的情况下更改的进度?
我不确定调用是否是正确的使用方法。它工作正常,但我想知道是否应该使用invoke或其他方法来更新gui控件?如果我想向超过1个gui控件报告 现在我正在使用invoke更新label2和listView控件。 我应该何时使用invoke,何时不使用,然后如何在不调用的情况下更新此gui控件C# 如何更新listView或标签并向backgroundworker报告在不使用invoke的情况下更改的进度?,c#,.net,winforms,C#,.net,Winforms,我不确定调用是否是正确的使用方法。它工作正常,但我想知道是否应该使用invoke或其他方法来更新gui控件?如果我想向超过1个gui控件报告 现在我正在使用invoke更新label2和listView控件。 我应该何时使用invoke,何时不使用,然后如何在不调用的情况下更新此gui控件 private string pathtosearch; private int countfiles; public Form1() { InitializeComponent(); } pri
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();
}
使用
ReportProgress
方法向UI发送消息,并使用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
可以使用两个参数重载:一个数字用于报告简单的“进度”,另一个称为object类型的UserData。如果要发送丰富的信息,请在此参数中插入自定义对象或具有所需属性的任何其他现有对象,并在另一侧-在ProgressChanged
事件中,将其再次“强制转换”为适当的类型,例如:
报告进度
:
backgroundWorker1.ReportProgress(countfiles, Tuple.Create(currFile, "Copying...", timeRem));
ProgressChanged
事件:
var data = e.UserState as Tuple<string, string, TimeSpan>;
var data=e.UserState作为元组;