为什么WinForm被BackgroundWorker卡住?

时间:2019-03-11 07:39:37

标签: c# winforms backgroundworker

嗨,我尝试使用此代码复制一些文件,一切都很好,该应用程序将复制文件,但是在复制过程中,我无法移动我的应用程序或执行任何操作 我尝试使用线程,但是它不起作用,我也使用backgroundWorker,但是仍然没有什么不卡住的唯一控件是progressBar,它的工作原理很好,这是我的代码:

find $pathname -type f \( -name "file*" -or -name "messagemulti.csv" -or -name "messagesemi.txt" -or -name "comma2.txt" -or -name "messagepipe.txt" -or -name "tokkalodi.txt" -or -name "ADMC_POSITION-LT3213.csv" -or -name "DMC_CASHFLOW248.csv" -or -name "ADMC_EQBASKET-WEIGHTS_52387.csv" -or -name "ADMC_POSITION-DDD7.csv" -or -name "ADMC_POSITION-DDD7.csv" \) -exec bash -c '[[ $(wc -l < "$1") -gt 1 ]] && echo "cat $1"' _ '{}' \;

3 个答案:

答案 0 :(得分:3)

对于正在紧密循环复制的文件的每个单个字节,您更新进度条的速度都快于UI的更新速度。您正在用无意义的工作充斥UI线程。

删除backgroundWorker1,它并没有做任何有用的事情。如果您没有办法跟踪进度(您无法使用File.Copy来跟踪进度),只需使用没有进度的进度条(将样式设置为Marquee)即可。

答案 1 :(得分:0)

为了进行测试,我创建了一个带有按钮,标签和后台工作程序的简单winform应用程序,并添加了以下相应事件:

private void OnBackgroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
    var worker = (BackgroundWorker)sender;

    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(500);
        worker.ReportProgress(i * 10);
    }
}

private void OnBackgroundWorkerProgressChanged(object sender, ProgressChangedEventArgs e)
{
    labelProgress.Text = e.ProgressPercentage.ToString();
}

private void OnBackgroundWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    labelProgress.Text = "Done";
}

private void OnButtonProgressClick(object sender, System.EventArgs e)
{
    backgroundWorker.RunWorkerAsync();
}

按预期工作。

答案 2 :(得分:0)

您是否可以尝试将DoWork更新为此:

private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    int mainProgress = 0;
    for (int i = 0; i < fileSize; i++)
    {
        int calculatedProgress = (i + 1) * 100 / Convert.ToInt32(fileSize);
        if(calculatedProgress > mainProgress)
        {
            mainProgress = calculatedProgress;
            backgroundWorker1.ReportProgress(mainProgress);
        }
    }
}

也许您进行的更新太多,以至于Window Thread一直都在更新,而没有时间做其他事情?