2012-11-21 173 views
0

我正在使用ThreadPool從服務器下載多個文件。我有一個要下載的文件列表,其中一些文件的大小很大。我想在下載其他小文件後下載這些大文件。而且,我正在使用WebClient.DownloadFile()使用ThreadPool完成其他線程後執行一些線程

目前我正在使用Thread.Join(time)啓動一段時間後啓動大文件的線程。但是不能保證當時其他下載將會​​完成。 time的值取決於網絡速度。

有沒有更好的解決方案來處理這個問題?請幫忙。

+0

您正在使用哪個版本的.net框架?您可以查看任務並行庫並根據需求在任務上使用ContinueWith。 – ryadavilli

+0

正在使用.Net framework 3.5 .. – user883769

+0

如果您在單獨的線程中開始這些下載(對於小文件或大文件),那麼您可以嘗試逐個啓動每個線程。有一個主線程使用來自其他子線程(用於下載)的信號或通知,然後啓動一個新線程。 – ryadavilli

回答

0

使用ManualResetEvent對象並將其設置在您的流程中並等待所有重置事件。類似這樣的:

public void DispatchWork(IEnumerable<string> worklist) 
    { 
     var resetEvents = new List<ManualResetEvent>(); 
     var batch = 100; 
     foreach (work in worklist) 
     { 
      var resetEvent = new ManualResetEvent(false); 
      resetEvents.Add(resetEvent); 

      ThreadPool.QueueUserWorkItem((a) => 
      { 
       try 
       { 
        // do work 
       } 
       catch (Exception e) 
       { 
        // do something 
        throw; 
       } 
       finally 
       { 
        if (resetEvent != null) resetEvent.Set(); 
       } 
      }); 
     } 
     foreach (var resetEvent in resetEvents) 
     { 
      resetEvent.WaitOne(); 
      resetEvent.Dispose(); // todo: use try-finally 
     } 

     resetEvents.Clear(); 
    } 
+0

嗨Sando,我已經使用ManualResetEvent ...如何區分重新啓動事件和小文件以開始下載大文件? – user883769

+0

使用waitevent傳遞「小文件結束」。在大文件線程中使用waitone()並在所有小文件完成後設置此事件 – Sando

相關問題