【发布时间】:2015-08-18 00:48:30
【问题描述】:
我在 C# 中做了一个简单的 WF,试图动态更改标签。
但是,当我运行此代码时,没有可见的变化,直到代码运行后,它才变为“处理 9”,0-8 从未显示。是因为它在循环内吗?
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
label9.Text = "Processing " + i.ToString();
Thread.Sleep(1000);
}
}
编辑:X-Tech 的代码有效,但是当我尝试将其合并到我的代码中时,我遇到了以下线程问题。我正在尝试在进度条摇摆时动态更改循环中的 label.text:
System.Windows.Forms.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理 附加信息:跨线程操作无效:控件“progressBar1”从创建它的线程以外的线程访问。 如果有这个异常的处理程序,程序可以安全地继续
我不知道如何解决这个问题,因为我对 Task.Factory.StartNew() 和 Invoke 语句不是很熟悉。
编辑 2:改编代码:
Task.Factory.StartNew(() =>
{
for (int i = 0; i < lstFilesToZip.Items.Count; i++)
{
zipArray[i] = lstFilesToZip.Items[i].ToString();
// Report progress.
ExecuteSecure(() => label9.Text = "Processing :" + Path.GetFileNameWithoutExtension(lstFilesToZip.Items[i].ToString()));
ExecuteSecure(() => progressBar1.PerformStep());
string zipFileName = Path.GetFileName(zipArray[i]);
string newFolder = txtDestinationFolder.Text + "\\" + Path.GetFileNameWithoutExtension(zipArray[i]);
//check to see if a directory with the file name for the zip file already exists, if not, it will create it
if (Directory.Exists(newFolder) == false)
{
DirectoryInfo newPath = Directory.CreateDirectory(newFolder);
if (lstCommonFiles.Items.Count > 0)
{
//copies each file in the common file list to each new folder created, the boolean indicates that it will overwrite existing files (true) or won't (false)
for (int k = 0; k < lstCommonFiles.Items.Count; k++)
{
File.Copy(lstCommonFiles.Items[k].ToString(), (newFolder + "\\" + Path.GetFileName(commonArray[k])), true);
}
}
//adds the zip file into the folder as well
File.Copy(zipArray[i], (newFolder + "\\" + zipFileName), true);
}
}
if (txtCommonFiles.Text.Length <= 0)
{
string result = "There are no common files selected, would you still like to proceed?";
DialogResult result1 = MessageBox.Show(result, "Common Files Missing", MessageBoxButtons.YesNo);
if (result1 == DialogResult.No)
{
return;
}
}
string[] dirs = Directory.GetDirectories(txtDestinationFolder.Text);
// Grabs the folders in the newly created directory
foreach (string dir in dirs)
lstDestinationFinal.Items.Add(dir);
//send sample file contents to preview window
string[] sampleFiles = Directory.GetFiles(lstDestinationFinal.Items[0].ToString());
//grabs the files
foreach (string zipFiles in sampleFiles)
lstSampleFile.Items.Add(zipFiles);
ExecuteSecure(() =>tabControl1.SelectedTab = tabPage2);
});
}
以及添加的方法:
private void ExecuteSecure(Action action)
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(() => action()));
}
else
{
action();
}
}
【问题讨论】:
-
那是因为你在 UI 线程中做工作,所以 UI 被冻结直到方法完成。使用 BackgroundWorker 及其 ReportProgress 实时更新您的标签。
-
@Darw1n34 您在哪一行遇到异常?
-
@X-TECH 我认为我们的电线交叉了,我感谢你并告诉你它有效:)
-
@Darw1n34 你的意思是它现在可以工作了吗?
-
@X-TECH 好的,谢谢。