我正在使用ThreadPool从服务器下载多个文件。我有一个要下载的文件列表,其中一些文件的大小很大。我想在下载其他小文件后下载这些大文件。而且,我正在使用WebClient.DownloadFile()
。使用ThreadPool完成其他线程后执行一些线程
目前我正在使用Thread.Join(time)
启动一段时间后启动大文件的线程。但是不能保证当时其他下载将会完成。 time
的值取决于网络速度。
有没有更好的解决方案来处理这个问题?请帮忙。
我正在使用ThreadPool从服务器下载多个文件。我有一个要下载的文件列表,其中一些文件的大小很大。我想在下载其他小文件后下载这些大文件。而且,我正在使用WebClient.DownloadFile()
。使用ThreadPool完成其他线程后执行一些线程
目前我正在使用Thread.Join(time)
启动一段时间后启动大文件的线程。但是不能保证当时其他下载将会完成。 time
的值取决于网络速度。
有没有更好的解决方案来处理这个问题?请帮忙。
使用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();
}
嗨Sando,我已经使用ManualResetEvent ...如何区分重新启动事件和小文件以开始下载大文件? – user883769
使用waitevent传递“小文件结束”。在大文件线程中使用waitone()并在所有小文件完成后设置此事件 – Sando
您正在使用哪个版本的.net框架?您可以查看任务并行库并根据需求在任务上使用ContinueWith。 – ryadavilli
正在使用.Net framework 3.5 .. – user883769
如果您在单独的线程中开始这些下载(对于小文件或大文件),那么您可以尝试逐个启动每个线程。有一个主线程使用来自其他子线程(用于下载)的信号或通知,然后启动一个新线程。 – ryadavilli