为什么ToolStripItem无法处理大数字?

时间:2013-05-20 18:50:00

标签: c# visual-studio-2008 .net-3.5

我有一个搜索文件夹的递归功能。

    private int contFiles = 0;
    private List<string> GetFiles(string folder, string filter)
    {
        var files = new List<string>();
        Action<string> getFilesInDir = null;
        getFilesInDir = new Action<string>(dir =>
        {
            contFiles++;
            tslQuant.Text = contFiles.ToString(); //ToolStripItem
            try
            {
                // get all the files in this directory
                files.AddRange(Directory.GetFiles(dir, filter));                   
                // and recursively visit the directories
                foreach (var subdir in Directory.GetDirectories(dir))
                {
                    getFilesInDir(subdir);
                }
            }
            catch (UnauthorizedAccessException uae)
            {
                Console.WriteLine(uae.Message);
            }
        });
        getFilesInDir(folder);
        return files;
    }

该函数递增contFiles并将该数字设置为ToolStripItem,但我总是得到&#34; System.ArgumentOutOfRangeException&#34;。

如何增加此值(最多5000)并以TSI显示?

ERROR:

System.ArgumentOutOfRangeException未处理   消息=&#34;索引超出范围。它必须是非负的且小于集合的大小。   参数名称:index&#34;

源=&#34; mscorlib程序&#34;   PARAMNAME =&#34;指数&#34;   堆栈跟踪:        在System.Collections.ArrayList.get_Item(Int32索引)中        在System.Windows.Forms.ToolStripItemCollection.get_Item(Int32索引)中        在System.Windows.Forms.ToolStrip.OnPaint(PaintEventArgs e)中        在System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e,Int16 layer)中        在System.Windows.Forms.Control.WmPaint中(消息&amp; m)        在System.Windows.Forms.Control.WndProc中(消息&amp; m)        在System.Windows.Forms.ToolStrip.WndProc中(消息&amp; m)        在System.Windows.Forms.StatusStrip.WndProc中(消息&amp; m)        在System.Windows.Forms.Control.ControlNativeWindow.WndProc中(消息&amp; m)        在System.Windows.Forms.NativeWindow.DebuggableCallback中(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)   InnerException:

修改

在读完程序的整个代码之后,我注意到函数在Do_Work中被篡改,所以我使用了

backgroundWorker2.ReportProgress((1));

报告aaand一切正常。

我不知道为什么,但不知何故,即使在backgroundWorker,标签和其他控件内也可以访问toolStripItem。

1 个答案:

答案 0 :(得分:0)

似乎你永远不会将contFiles变量重置为零。如果你多次拨打GetFiles(),可能会遇到问题。所以你可能想把它重置为零

    contFiles = 0;    // Reset variable to prevent overflow 
    var files = new List<string>();
    Action<string> getFilesInDir = null;
    getFilesInDir = new Action<string>(dir =>
    { ...