我正在使用Directory.GetFiles
给我mp3文件,我想用ListBox
填充结果,但不是在程序通过方法时停止程序,我可以得到它来搜索并填充ListBox
,因为它获取mp3文件?
所以我正在使用的是如下(并且它未能在时间添加它们,它会在完成后立即添加它们)
private List<string> Getmp3sFromFolders(string folder)
{
List<string> fileArray = new List<string>();
try
{
DirectoryInfo dir = new DirectoryInfo(folder);
var files = dir.EnumerateFiles("*.mp3");
foreach (var file in files)
{
fileArray.Add(file.FullName);
Dispatcher.BeginInvoke(_AddMP3ToListbox, file.Name);
}
var directories = dir.EnumerateDirectories();
foreach (var subdir in directories)
{
fileArray.AddRange(Getmp3sFromFolders(subdir.FullName));
}
// lblFolderSearching.Content = folder.ToString();
}
catch
{
}
return fileArray;
}
我添加了_AddMP3ToListbox = AddMP3ToListbox
答案 0 :(得分:11)
使用Directory.EnumerateFiles
代替Directory.GetFiles
。
EnumerateFiles
将返回系统找到的文件 - 而不是等待找到所有文件。
在后台线程上执行此操作,并使用Dispatcher.Invoke
或Dispatcher.BeginInvoke
到UI线程,因为每个线程都会将其添加到ListBox
。
这是我拼凑的一个简单例子。这是XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ListBox x:Name="_FileList" />
<Button Grid.Row="1" Content="Go!" Click="Button_Click" />
</Grid>
</Window>
这是代码隐藏的代码:
using System;
using System.IO;
using System.Windows;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private Action<string> _AddToListBox;
public MainWindow()
{
InitializeComponent();
_AddToListBox = AddToListBox;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Action action = Go;
action.BeginInvoke(null, null);
}
private void Go()
{
foreach (var file in Directory.EnumerateFiles(@"c:\windows\system32\"))
{
Dispatcher.BeginInvoke(_AddToListBox, file);
}
}
private void AddToListBox(string toAdd)
{
_FileList.Items.Add(toAdd);
}
}
}
我绝不打算将此作为最佳实践或包罗万象的例子。只是向您展示一种方法。顺便说一句,我选择了system32目录只是因为它有很多文件,所以我可以测试它。但是我的机器上几乎可以立即使用。