我想更快地读取大容量音频文件的标签。目前,我可以存储5000个音频文件信息的结构列表在大约7秒。
问题是当我选择有20,000或40,000个文件的文件夹时,应用程序继续运行,并且不通知进程已经完成。而当它读取5,000个文件时,它会显示消息框,在7秒内提示“完成加载文件5000”。
这是我的代码:
public struct SongInfoStruct
{
public string Key;
public string Value;
public string Artist;
public double Duration;
public string Comments;
public string Album;
public string Missing;
};
public async Task<SongInfoStruct> GetSongInfo(string url)
{
var songinfo = (dynamic)null;
var tagFile = TagLib.File.Create(url);
var songName = (dynamic)null;
var artist = (dynamic)null;
var album = (dynamic)null;
var comments = (dynamic)null;
var duration = (dynamic)null;
await Task.Run(() =>
{
songName = tagFile.Tag.Title;
artist = tagFile.Tag.FirstPerformer;
album = tagFile.Tag.Album;
comments = tagFile.Tag.Comment;
duration = tagFile.Properties.Duration.TotalSeconds;
});
return songinfo = new SongInfoStruct
{
Key = url,
Value = songName,
Artist = artist,
Duration = duration,
Comments = comments,
Album = album,
Missing = " "
};
}
public async Task<List<SongInfoStruct>> ReadPathFromSource(string Source)
{
var files = Directory.EnumerateFiles(Source, "*",
SearchOption.AllDirectories).Where(s => s.EndsWith(".mp3") ||
s.EndsWith(".m4a"));
int length = files.Count();
var listpaths = new List<SongInfoStruct>(length);
listpaths.Clear();
foreach (string PathsClickSong_temp in files)
{
var item = await GetSongInfo(PathsClickSong_temp);
await Task.Run(() =>
{
listpaths.Add(item);
});
}
MessageBox.Show("Done loading files "+ listpaths.Count.ToString());
return listpaths;
}发布于 2022-03-14 13:09:24
作为一种良好的实践,请始终尝试将ConfigureAwait设置为false,除非您希望使用相同的调用上下文。
var item = await GetSongInfo(PathsClickSong_temp).ConfigureAwait(false);在这里,您可以使用Task.WhenAll来尝试它,它同时获取多个数据。当CPU工作紧张时,Task.Run很适合使用,详情请看When correctly use Task.Run and when just async-await。
var listpaths = new List<Task<SongInfoStruct>>(length);
listpaths.Clear();
foreach (string PathsClickSong_temp in files)
{
var item = GetSongInfo(PathsClickSong_temp);
listpaths.Add(item);
}
await Task.WhenAll(listpaths);https://stackoverflow.com/questions/71467721
复制相似问题