我正在使用以下例程来处理目录中的一组视频:

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/

10-17 00:55