C# 使用ThreadPool在其他线程完成后执行一些线程

C# 使用ThreadPool在其他线程完成后执行一些线程,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我正在使用ThreadPool从服务器下载多个文件。我有一个要下载的文件列表,其中一些文件很大。我想在下载其他小文件之后再下载这些大文件。我使用的是WebClient.DownloadFile() 目前我正在使用Thread.Join(time)启动线程,以便在一段时间后启动大型文件。但也不能保证其他下载会在那时完成。time的值将根据网络速度而变化 有没有更好的解决办法?请提供帮助。使用ManualResetEvent对象并在进程内设置它,然后等待所有重置事件。大概是这样的: public v

我正在使用ThreadPool从服务器下载多个文件。我有一个要下载的文件列表,其中一些文件很大。我想在下载其他小文件之后再下载这些大文件。我使用的是
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()并在所有小文件完成后设置此事件