Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在线程中使用C#将字符串添加到WPF中的listbox_C#_Wpf_Multithreading_Listbox_Runtime - Fatal编程技术网

在线程中使用C#将字符串添加到WPF中的listbox

在线程中使用C#将字符串添加到WPF中的listbox,c#,wpf,multithreading,listbox,runtime,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);

我想在按下按钮时显示每个文件的路径。 我现在拥有的是一个函数,它可以遍历文件夹并显示路径,但只有在函数完成时:

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);  
}
这意味着我必须等待,然后才能做其他事情。
如何在函数运行时立即显示文件的路径,这样我就不必等待函数完成,在列表框中显示之前获取所有路径?

这会使您的方法在另一个线程上运行:

public void StartProcessThread(string targetDirectory)
{
    Thread T = new Thread(new ParameterizedThreadStart(ProcessDirectory));

    T.Start(targetDirectory);
}

public void ProcessDirectory(object objTargetDirectory)
{
    string targetDirectory = (string)objTargetDirectory;

    // 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)
{
    Dispatcher.Invoke(new Action(() => {
        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);
}
我想我记得在某个地方读到,由于可能发生的其他一些问题,不推荐使用这种“黑客”,但我不记得它是什么,也不记得在哪里读过它。然而,它确实起到了作用


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

尝试了您的示例,但我得到了以下错误:“用0个参数调用中的委托构造函数”。后来尝试了这个,但它做了我不希望它做的事情:Dispather.Invoke(newaction(delegate(){myListBox.Items.Add(path);}));这不是我尝试过的lambda表达吗?但是不抱歉,它不起作用:/仍然必须等待函数完成。没错。也许列表框需要某种更新或失效。你可以从下面的答案中尝试ScrollIntoView。Eirik的answear效果很好,但正如他测量的那样,问题可能会出现:/但我会尝试一下,直到有人能告诉我这些问题:)谢谢你的努力和帮助!它工作得很好:)但正如你所说。。可能会出现问题。。有谁能告诉我问题是什么以及我如何解决这个问题吗?我会一直这样做,直到有人对我大喊大叫:)谢谢你的代码片段!启动线程后如何停止线程?或者终止线程?您可以通过添加一个标志并在循环中检查它来停止ProcessDirectory方法中的foreach循环。添加一个按钮或改变标志的东西,这将打破循环,停止向列表框添加项目。