嗨,我尝试使用此代码复制一些文件,一切都很好,该应用程序将复制文件,但是在复制过程中,我无法移动我的应用程序或执行任何操作 我尝试使用线程,但是它不起作用,我也使用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"' _ '{}' \;
答案 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一直都在更新,而没有时间做其他事情?