c# - 在线程中使用 C# 将字符串添加到 WPF 中的列表框

标签 c# wpf multithreading listbox runtime

我想在按下按钮时显示每个文件的路径。 我现在拥有的是一个迭代文件夹并显示路径的函数,但仅在该函数完成时才显示:

public void ProcessDirectory(string targetDirectory)
{
    // Process the list of files found in the directory.
    try
    {
        var fileEntries = Directory.GetFiles(targetDirectory);

        foreach (var fileName in fileEntries)
        {
            ProcessFile(fileName);
        }
    }
    catch (Exception e){}
    // Recurse into subdirectories of this directory.
    try
    {
        var subdirectoryEntries = Directory.GetDirectories(targetDirectory);

        foreach (string subdirectory in subdirectoryEntries)
            ProcessDirectory(subdirectory);
    }
    catch (Exception e){}
}


public void ProcessFile(string path)
{
    myListBox.Items.Add(path);  
}

这意味着我必须等待才能做其他事情。 如何在函数运行时立即显示文件的路径,这样我就不必等待函数完成,在列表框中显示之前获取所有路径?

最佳答案

我不记得在哪里遇到了这段代码,但是如果您将 ProcessFile 方法修改为类似的内容,它将在每个项目添加到列表后更新您的 UI。

public void ProcessFile(string path)
{
    myListBox.Items.Add(path);
    myListBox.ScrollIntoView(myListBox.Items[myListBox.Items.Count-1]);
    Dispatcher.Invoke(new Action(delegate { }), DispatcherPriority.Background);
}

我想我记得在某处读到过,由于可能会发生许多其他问题,因此不建议使用此“黑客”,但我不记得它是什么或在哪里读到它。然而它确实完成了这项工作。

也许其他人可以告诉我们这些问题是什么......

关于c# - 在线程中使用 C# 将字符串添加到 WPF 中的列表框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9464359/

相关文章:

c# - 任务异步/等待不适用于 WPF,因为它在其他场景中有效

java - android 错误 :Execution failed for task ':app:mergeDebugResources' . > java.lang.OutOfMemoryError: 无法创建新的 native 线程

c# - Squirrel.windows 在桌面上创建多个快捷方式

c# - Controller 重载索引方法

c# - 如何将计时器信息从主场景传递到另一个(再试一次)场景?统一C#

c# - Visual Studio - Windows 窗体或 WPF?

c# - 如何仅在 wpf 列表框的一行上更改前景色?

java - 我可以终止等待 TCP 连接进入的线程吗?

multithreading - 基本的Perl线程: threads->list() does not decrease

c# - 从保留的 ListBox 中获取选定的项目