Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更新listView或标签并向backgroundworker报告在不使用invoke的情况下更改的进度?_C#_.net_Winforms - Fatal编程技术网

C# 如何更新listView或标签并向backgroundworker报告在不使用invoke的情况下更改的进度?

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

我不确定调用是否是正确的使用方法。它工作正常,但我想知道是否应该使用invoke或其他方法来更新gui控件?如果我想向超过1个gui控件报告

现在我正在使用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();
}

使用
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作为元组;