我正在使用以下例程来处理目录中的一组视频:
AllVideos = new List<MyVideo>();
for (int i = 0; i < AllVideosFileNames.Length; i++)
{
MyVideo CurrentVid = new MyVideo(AllVideosFileNames[i], false); // constructor (loads the video to the system)
CurrentVid.PopulateAllFrames(); // Method that takes forever
CurrentVid.PopluateTestFrames(); // Method that takes less than forever
CurrentVid.NormalizeTestFrames(); // Method that takes some time
AllVideos.Add(CurrentVid); // Add finished object to my results container
}
我想同时并行处理多个视频并节省时间。我尝试这样做:
for (int i = 0; i < AllVideosFileNames.Length; i++)
{
Thread TempThread = new Thread(() =>
{
MyVideo CurrentVid = new MyVideo(AllVideosFileNames[i], false);
CurrentVid.PopulateAllFrames();
CurrentVid.PopluateTestFrames();
CurrentVid.NormalizeTestFrames();
AllVideos.Add(CurrentVid);
});
TempThread.Start();
}
然而,这执行得如此之快,实际上什么也没做。我的意思是,当我逐步执行代码时,当循环完成执行时
AllVideos
为空。有更好的设计想法吗?或修复?请和谢谢。
最佳答案
也许看看 TPL 和/或 PLINQ。你知道 .AsParallel()
吗?
怎么样:
AllVideos = AllVideosFileNames
.AsParallel()
.Select(fileName => GetVideo(filename))
.ToList();
其中
GetVideo(filename)
定义如下:private MyVideo GetVideo(string filename)
{
MyVideo currentVid = new MyVideo(filename, false);
currentVid.PopulateAllFrames();
currentVid.PopluateTestFrames();
currentVid.NormalizeTestFrames();
return currentVid;
}
有关更多信息,请参阅 Introduction to PLINQ。
关于c# - 如何多线程我的代码同时处理多个文件,通过相同的功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42951692/