Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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# 如何向由单击触发的backgroundWorker添加一段代码?_C#_Winforms_Click_Backgroundworker - Fatal编程技术网

C# 如何向由单击触发的backgroundWorker添加一段代码?

C# 如何向由单击触发的backgroundWorker添加一段代码?,c#,winforms,click,backgroundworker,C#,Winforms,Click,Backgroundworker,我需要处理大量的file.copy文件,这使得我的form1“没有响应”,并且我的程序显示死锁异常,因此我想创建一个backgroundWorker来处理所有主要处理。 我所做的: 按钮: if (backgroundWorker1.IsBusy != true) { backgroundWorker1.RunWorkerAsync(); } 嫁妆: private void backgroundWorker1_D

我需要处理大量的file.copy文件,这使得我的form1“没有响应”,并且我的程序显示死锁异常,因此我想创建一个backgroundWorker来处理所有主要处理。 我所做的:

按钮:

if (backgroundWorker1.IsBusy != true)
            {
                backgroundWorker1.RunWorkerAsync();
            }
嫁妆:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        bool continueWork = true;

        while (continueWork)
        {
            if ((worker.CancellationPending == true))
            {
                e.Cancel = true;
                break;
            }
            else
            {
                foreach (string name in listFiles) //global list
                {
                    string destwithFilename= dest + "\\" + Path.GetFileName(name);
                    try
                    { File.Copy(name, destwithFilename, false);}
                    catch (Exception EX_NAME)
                    {
                        Console.WriteLine(EX_NAME);
                    }
                    worker.ReportProgress((1));
                }
                pbStatus.Increment(50); //Error, I can't access form1, another thread.
                continueWork = false; //If job is done, break;
                System.Threading.Thread.Sleep(500);
            }
        }
    }
问题:

1) 表格1仍然显示为“未响应”

2) 无法访问Form1

3) 即使使用backgroundWorker,死锁异常仍然会出现//也许我应该禁用托管调试助手

编辑 嫁妆

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        bool continueWork = true;

        while (continueWork)
        {
            foreach (string name in Files) //Global
            {
                if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    string destwithFilename= dest + "\\" + Path.GetFileName(name);
                    try
                    {
                        File.Copy(name, destwithFilename, false); //no overwritting
                        worker.ReportProgress((1));
                        //System.Threading.Thread.Sleep(50);
                    }
                    catch (Exception EX_NAME)
                    {
                        Console.WriteLine(EX_NAME);
                    }
                }
            }
            continueWork = false;
        }
    }
进度更改:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        pbProcess.Value = e.ProgressPercentage;
        if (pbProcess.Value == pbProcess.Maximum)
        {
            cbFinal.Checked = true;
        }
    }
结果:

输出速度确实很慢,但现在我的表单继续工作而没有“响应”。 pbProcess没有递增,我不知道为什么。
pbProcess是一个进度条。

要报告进度,您应该:

  • WorkerReportsProgress
    属性设置为True
  • 使用后台工作人员的
    ReportProgress()
    方法报告进度
  • 然后,处理后台工作人员的
    ProgressChanged
    事件。并设置pbStatus的值
代码:

报告进展情况

处理ProgressChanged事件

进展

对于进度,您使用ReportProgress(1)报告进度,这会将进度条的值设置为1,而不会增加1

int cpt = 1;
int totalFilesCount = listFiles.Count;

foreach (var field in listFiles)
{
      // Copy the file ...

      backgroundWorker1.ReportProgress((cpt / totalFilesCount) * 100);
      cpt++;
}

对于第二个问题(无法从anotehr线程访问表单),您应该使用backgroundworker对象的ReportProgress()方法更新进度,并注册到调用表单中的事件以更新进度条状态。是的,我已经这样做了。但我不明白的是,即使与backgroundWorker一起工作,我的表单仍然碰巧“没有响应”:/您应该在foreach循环中查询CancelationPending,以便实际停止文件复制操作。pbStatus.Value=e.ProgressPercentage//对吗?是:pbStatus.Value=e.ProgressPercentage;//我以为这是一种方法From1的问题是否仍然存在?不再,我更改了代码,但现在ProgressChanged不起作用。。。我会把我的代码。使用你的代码,我会把一个断点。。。e、 进度百分比始终为零。
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
      pbStatus.Value = e.ProgressPercentage;
}
int cpt = 1;
int totalFilesCount = listFiles.Count;

foreach (var field in listFiles)
{
      // Copy the file ...

      backgroundWorker1.ReportProgress((cpt / totalFilesCount) * 100);
      cpt++;
}