gpt4 book ai didi

c# - Parallel.ForEach 用例

转载 作者:行者123 更新时间:2023-12-05 02:27:42 25 4
gpt4 key购买 nike

我想知道我是否应该为我的案例使用 Parallel.ForEach()。一些背景信息:我正在使用 NAudio 库开发一个小型音乐播放器。我想在工厂方法中使用 Parallel.ForEach() 来快速访问 .mp3 文件并创建 TrackModel 对象来表示它们(大约 400 个)。代码如下所示:

public static List<TrackModel> CreateTracks(string[] files)
{
// Guard Clause
if (files == null || files.Length == 0) throw new ArgumentException();

var output = new List<TrackModel>();

TrackModel track;

Parallel.ForEach(files, file =>
{
using (MusicPlayer musicPlayer = new MusicPlayer(file, 0f))
{
track = new TrackModel()
{
FilePath = file,
Title = File.Create(file).Tag.Title,
Artist = File.Create(file).Tag.FirstPerformer,
TrackLength = musicPlayer.GetLengthInSeconds(),
};
}

lock (output)
{
output.Add(track);
}
});

return output;
}

注意:我使用lock来防止多个线程同时向列表中添加元素。

我的问题如下:在这种情况下我应该使用 Parallel.ForEach() 还是我最好编写一个普通的 foreach 循环?这是获得更好性能的正确方法吗?我应该首先将多线程与文件访问结合使用吗?

最佳答案

最好避免同时使用 foreachParallel.ForEach。在这种情况下,AsParallel() 是您的 friend 。

试试这个:

public static List<TrackModel> CreateTracks(string[] files)
{
if (files == null || files.Length == 0) throw new ArgumentException();

return
files
.AsParallel()
.AsOrdered()
.WithDegreeOfParallelism(2)
.Select(file =>
{
using (MusicPlayer musicPlayer = new MusicPlayer(file, 0f))
{
return new TrackModel()
{
FilePath = file,
Title = File.Create(file).Tag.Title,
Artist = File.Create(file).Tag.FirstPerformer,
TrackLength = musicPlayer.GetLengthInSeconds(),
};
}
})
.ToList();
}

这会为您处理所有并行逻辑和幕后锁定。

关于c# - Parallel.ForEach 用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73004174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com