我使用下面的程序來從一個目錄處理一組視頻:如何多線程我的代碼同時處理幾個文件,通過相同的功能?
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哪個更更好,你控制研究已經在你的任務。[參見本(https://msdn.microsoft.com/en-us/library/dd460717(V = vs.110) .aspx) –
如果您只是爲每件作品啓動一個線程,則父線程將繼續。你必須等待他們完成。我寧願爲每個創建一個任務(使用'Task.Run'),然後在創建的任務創建後對其執行「Task.Wait」。然後它們將平行運行完成 – Baldrick
它在正常循環中持續一次迭代多長時間?看起來你的線程在循環結束時運行。 「AllVideos」呢?它從何而來?如果它不是局部變量,則可能有競態條件問題。考慮鎖定 –