2016-06-20 61 views
1

我有一個應用程序來解壓縮文件夾和合並文件,我想在這裏使用異步,我想要一個線程解壓縮文件夾,另一個線程合併解壓縮文件夾中的文件,一旦解壓縮線程完成其任務,應用程序應該等待合併線程完成。合併線程(孩子)是依賴於解壓線程(父)以下 是我使用 裏面的代碼文件的Program.cs.NET控制檯應用程序中的異步編程

var t1= Task.Factory.StartNew(() => 
    {      
     obj.UnZipFiles(files, formats); 
    }); 

內unzip.cs文件

var t2= Task.Factory.StartNew(() => 
    { 
     obj.MergeFiles(); 
    }); 

在節目。 CS文件,我有

Task.WaitAll(t1); 

我的應用程序不會等待子線程來完成, 任何幫助,將不勝感激。

+0

如果步驟2只能在步驟1之後發生,則不會發生併發和不異步。你確定你明白這個問題嗎?聽起來就像你開始解決一個不存在的問題。 – usr

+0

你在說什麼「小孩線」?順便說一句。我們在這裏處理*'Task's *,而不是線程。 – stakx

+0

@usr考慮一個例子:每個包含10個文件的2個zip文件夾,我希望應用程序能夠完成第一個zip文件夾的解壓縮並開始合併其中的10個文件,並且它應該在應用合併時開始解壓縮第二個zip文件夾從我看到的第一個zip文件夾 –

回答

2

當創建第二個任務時,使用Continuation。

E.g.

var t1 = new Task(() => obj.UnZipFiles(files, formats)); 
var t2 = t1.ContinueWith((t) => obj.MergeFiles()); 
t1.Start(); 

這將確保第二個任務僅在第一個任務完成時觸發。

+0

感謝您的建議,我想這會使任務同步,糾正我,如果我錯了 –

+0

@Kiran_Ray從我的理解,這將是一種「排序」同步處理,因爲第二個任務將運行在不同的線程當第一個任務結束時。如果你傳入'TaskContinuationOptions.ExecuteSynchronously',那麼第二個任務將在同一個線程上運行,首先使它真正同步。 – Alex

+0

@Kiran_Ray另一方面,如果您需要等待第一個任務的結果,因爲在完成第一個任務之前您無法做其他任何事情......那麼使用任務可能沒有太多意義? – Alex

相關問題