2012-11-21 221 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

相关问题