首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Taglib性能问题

Taglib性能问题
EN

Stack Overflow用户
提问于 2022-03-14 12:22:21
回答 1查看 64关注 0票数 0

我想更快地读取大容量音频文件的标签。目前,我可以存储5000个音频文件信息的结构列表在大约7秒。

问题是当我选择有20,000或40,000个文件的文件夹时,应用程序继续运行,并且不通知进程已经完成。而当它读取5,000个文件时,它会显示消息框,在7秒内提示“完成加载文件5000”。

这是我的代码:

代码语言:javascript
复制
        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;
        }
EN

回答 1

Stack Overflow用户

发布于 2022-03-14 13:09:24

作为一种良好的实践,请始终尝试将ConfigureAwait设置为false,除非您希望使用相同的调用上下文。

代码语言:javascript
复制
var item = await GetSongInfo(PathsClickSong_temp).ConfigureAwait(false);

在这里,您可以使用Task.WhenAll来尝试它,它同时获取多个数据。当CPU工作紧张时,Task.Run很适合使用,详情请看When correctly use Task.Run and when just async-await

代码语言:javascript
复制
 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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71467721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档