我首先搜索文件名。一旦找到它,我会寻找其他文件。第一个文件是.xls文件,它就像我在正确目录中的签名。然后我得到这个目录中的所有xml文件。
我在线上放了一个断点:
BeginInvoke(new Action(() => textBox1.AppendText(pResult[i-1].FullName+Environment.NewLine)));
我看到4个xml文件:
但如果我让程序在没有任何断点的情况下运行,那么我只会在列表中看到第3个文件:
public void Search(string strExtension,
DirectoryInfo di,
List<FileSystemInfo> pResult)
{
try
{
foreach (FileInfo fi in di.GetFiles())
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => label2.Text = fi.Name));
}
if (fi.Name == "MessageLog.xsl")
{
foreach (FileInfo fii in di.GetFiles())
{
if (fii.Extension == strExtension)
pResult.Add(fii);
}
if (InvokeRequired)
{
BeginInvoke(new Action(() => textBox1.AppendText("Number Of History Files Found: ===> " + pResult.Count.ToString() + Environment.NewLine)));
}
for (int i = 0; i < pResult.Count; i++)
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => textBox1.AppendText(pResult[i-1].FullName+Environment.NewLine)));
}
}
}
}
foreach (DirectoryInfo diChild in di.GetDirectories())
Search(strExtension, diChild, pResult);
}
catch (Exception e)
{
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Search(".xml", dirinf, fsi);
}
答案 0 :(得分:1)
您获得此行为的原因是:
BeginInvoke(new Action(() => textBox1.AppendText(pResult[i-1].FullName+Environment.NewLine)));
您的操作指向内存位置pResult[i-1]
,它不会复制该值,而是保留pResult
的索引为i
的位置。循环执行后指向count的i
。假设pResult[i-1]
指向内存位置x012
,那么您的操作语句将保留:
textBox1.AppendText(from location x012)
现在当你离开循环时,它还没有执行,它只是被定义为从特定的内存位置附加文本。这就是为什么当您执行该操作时,您将获得所有操作的最后一个值。
你可能会看到Jon Skeet的类似脑筋急转弯:http://www.yoda.arachsys.com/csharp/teasers.html