0

我首先搜索文件名。一旦找到它,我就会寻找其他文件。第一个文件是一个 .xls 文件,就像我在正确目录中的签名一样。然后我得到这个目录中的所有 xml 文件。

我在行上放了一个断点:

BeginInvoke(new Action(() => textBox1.AppendText(pResult[i-1].FullName+Environment.NewLine)));

我看到 4 个 xml 文件:

  • 丹尼.xml
  • adi.xml
  • yaron.xml
  • 贝壳.xml

但是,如果我让程序在没有任何断点的情况下运行,那么我只会在 List 中看到第 3 个文件 4 次:

  • yaron.xml
  • yaron.xml
  • yaron.xml
  • yaron.xml

有人可以指出为什么会发生这种情况吗?

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);

        }
4

1 回答 1

1

你得到这种行为的原因是:

BeginInvoke(new Action(() => textBox1.AppendText(pResult[i-1].FullName+Environment.NewLine)));

您的操作指向内存位置pResult[i-1],它不会复制值,而是保存pResult带有索引的位置i。在i循环执行之后指向计数。假设pResult[i-1]指向一个内存位置x012,那么您的操作语句正在持有:

textBox1.AppendText(from location x012)

现在当你退出循环时,它还没有执行,它只是被定义为从那个特定的内存位置附加文本。这就是为什么当您执行该操作时,您将获得所有操作的最后一个值。

您可能会看到 Jon Skeet 的类似脑筋急转弯:http ://www.yoda.arachsys.com/csharp/teasers.html

于 2012-08-24T10:46:14.213 回答