在线程中使用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循环。添加一个按钮或改变标志的东西,这将打破循环,停止向列表框添加项目。