首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我将列表移动到新线程,则无法填充它

如果我将列表移动到新线程,则无法填充它
EN

Stack Overflow用户
提问于 2013-01-02 12:34:24
回答 1查看 233关注 0票数 1

我使用SafeFileEnumerator类来搜索文件夹根目录中的文件,这个类只在有权限的情况下从位置返回文件,所以我正在成功地使用它。

当我试图以这种方式填写我的列表时,一切都很好:

代码语言:javascript
运行
复制
 List<string> list = new List<string>();
                    list = SafeFileEnumerator.EnumerateFiles(folderBrowserDialog1.SelectedPath,
                        "*.*", SearchOption.AllDirectories).ToList();

但是在这种情况下,我的GUI冻结了,所以我将它移动到新线程,在这种情况下什么也没有发生,我想知道为什么:

代码语言:javascript
运行
复制
private void btnAddDir_Click(object sender, EventArgs e)
{
    List<string> list = new List<string>();
    string fileToAdd = string.Empty;
    List<string> filesList = new List<string>();
    dialog = folderBrowserDialog1.ShowDialog();
    tbAddDir.Text = folderBrowserDialog1.SelectedPath;
    string pathToSearch = folderBrowserDialog1.SelectedPath;
    if (dialog == DialogResult.OK)
    {
        toolStripStatusLabel.Text = "Search for pcap files...";
        groupBoxRootDirectory.Enabled = false;
        btnStart.Enabled = false;                

        ThreadStart starter = delegate
        {
            list = SafeFileEnumerator.EnumerateFiles(pathToSearch, "*.pcap", SearchOption.AllDirectories).ToList();
        };

        Thread t = new Thread(starter);
        t.IsBackground = true;
        t.Start();

        if(list.Count != 0)
            AddFilesToListBox(list);
    }
}

SafeFileEnumerator类代码:

代码语言:javascript
运行
复制
public static class SafeFileEnumerator
{
    public static IEnumerable<string> EnumerateDirectories(string parentDirectory, string searchPattern, SearchOption searchOpt)
    {
        try
        {
            var directories = Enumerable.Empty<string>();
            if (searchOpt == SearchOption.AllDirectories)
            {
                directories = Directory.EnumerateDirectories(parentDirectory).SelectMany(x => EnumerateDirectories(x, searchPattern, searchOpt));
            }
            return directories.Concat(Directory.EnumerateDirectories(parentDirectory, searchPattern));
        }
        catch (UnauthorizedAccessException ex)
        {
            return Enumerable.Empty<string>();
        }
    }

    public static IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOpt)
    {
        try
        {
            var dirFiles = Enumerable.Empty<string>();
            if (searchOpt == SearchOption.AllDirectories)
            {
                dirFiles = Directory.EnumerateDirectories(path).SelectMany(x => EnumerateFiles(x, searchPattern, searchOpt));
            }

            return dirFiles.Concat(Directory.EnumerateFiles(path, searchPattern));
        }
        catch (UnauthorizedAccessException ex)
        {
            return Enumerable.Empty<string>();
        }
    }
}

在我的名单上满是文件之后:

代码语言:javascript
运行
复制
private void AddFilesToListBox(List<string> filesList)
{
    string fileToAdd = string.Empty;
    Editcap editcap = new Editcap();
    Capinfos capinfos = new Capinfos();
    BackgroundWorker backgroundWorker = new BackgroundWorker();
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.DoWork +=
        (s1, e1) =>
        {
            foreach (string fileName in filesList)
            {
                FileInfo fileInfo = new FileInfo(fileName);
                if (checkFileCreationDate(fileInfo))
                {
                    if (editcap.isWiresharkFormat(fileInfo.FullName))
                    {
                        if (editcap.isLibpcapFormat(fileInfo.FullName))
                        {
                            addFileToListBox(fileInfo.FullName, capinfos.getFileDuration(fileInfo.FullName));
                        }
                        else if (!editcap.isLibpcapFormat(fileInfo.FullName))
                        {
                            fileToAdd = editcap.getNewFileName(fileInfo.FullName);

                            if (new FileInfo(fileToAdd).Exists && !fileInfo.Exists)
                            {
                                addFileToListBox(fileToAdd, capinfos.getFileDuration(fileInfo.FullName));
                            }
                        }
                    }
                }

                //this.Invoke((MethodInvoker)delegate { lvFiles.Items[lvFiles.Items.Count - 1].Selected = true; });
                toolStripStatusLabel.Text = string.Format("{0} files were added", lvFiles.Items.Count);
            }

            //this.Invoke((MethodInvoker)delegate { lvFiles.Items[lvFiles.Items.Count - 1].Selected = true; });
        };

    backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
    (s1, e1) =>
    {
        groupBoxRootDirectory.Enabled = true;
        btnClear.Enabled = true;
        if (lvFiles.Items.Count != 0)
            btnStart.Enabled = true;
        toolStripStatusLabel.Text = string.Format("{0} files were added", lvFiles.Items.Count);

        if (tbAddDir.Text != "")
        {
            listener = new FileListener();
            listener.startListener(tbAddDir.Text);
            listener._newFileEventHandler += listener_newFileEventHandler;
        }
    });

    backgroundWorker.RunWorkerAsync();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-02 13:04:20

在t.start()之后,我调用AddFilesToListBox(列表);

您没有实现异步模式

在调用t.Start();之后,线程还没有完成它的工作,所以在调用AddFilesToListBox时,您的列表仍然是空的。实现异步模式,并在线程完成任务后调用AddFilesToListBox

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14122140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档