0

ファイル名を検索することから始めます。見つけたら、他のファイルを探します。最初のファイルは .xls ファイルで、正しいディレクトリにいるという署名のようなものです。次に、このディレクトリ内のすべての xml ファイルを取得します。

私は行にブレークポイントを置きます:

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

4 つの xml ファイルが表示されます。

  • ダニー.xml
  • adi.xml
  • yaron.xml
  • shelly.xml

しかし、ブレークポイントなしでプログラムを実行すると、リストの 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)));

アクションはメモリ location を指していpResult[i-1]ます。値をコピーせず、代わりにpResultwith indexの場所を保持しますi。ループ実行後はcountiを指しています。アクションステートメントが保持し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 に答える