C# 使用ThreadPool在其他线程完成后执行一些线程
我正在使用ThreadPool从服务器下载多个文件。我有一个要下载的文件列表,其中一些文件很大。我想在下载其他小文件之后再下载这些大文件。我使用的是C# 使用ThreadPool在其他线程完成后执行一些线程,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我正在使用ThreadPool从服务器下载多个文件。我有一个要下载的文件列表,其中一些文件很大。我想在下载其他小文件之后再下载这些大文件。我使用的是WebClient.DownloadFile() 目前我正在使用Thread.Join(time)启动线程,以便在一段时间后启动大型文件。但也不能保证其他下载会在那时完成。time的值将根据网络速度而变化 有没有更好的解决办法?请提供帮助。使用ManualResetEvent对象并在进程内设置它,然后等待所有重置事件。大概是这样的: public v
WebClient.DownloadFile()
目前我正在使用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();
}
public void DispatchWork(IEnumerable工作列表)
{
var resetEvents=新列表();
var批=100;
foreach(工作列表中的工作)
{
var resetEvent=新的手动重置事件(false);
resetEvents.Add(resetEvent);
ThreadPool.QueueUserWorkItem((a)=>
{
尝试
{
//工作
}
捕获(例外e)
{
//做点什么
投掷;
}
最后
{
如果(resetEvent!=null)resetEvent.Set();
}
});
}
foreach(resetEvents中的var resetEvent)
{
resetEvent.WaitOne();
resetEvent.Dispose();//todo:使用try finally
}
resetEvents.Clear();
}
您使用的是哪个版本的.net framework?您可以查看Task Parallel Library并使用ContinueWith on tasks来满足您的需求。我使用的是.Net framework 3.5。如果您在单独的线程中启动这些下载(对于小文件或大文件),则可以尝试逐个启动每个线程。有一个主线程,它使用来自其他子线程(用于下载)的信号或通知,然后启动一个新线程。你的意思是,我需要有两个单独的列表,用于大小文件,并在两个单独的线程中一个接一个地执行下载?嗨,Sando,我已经在使用ManualResetEvent。。。如何区分重置事件和小文件以开始下载大文件?使用waitevent来传达“小文件结束”。在大文件线程中,使用waitone()并在所有小文件完成后设置此事件