我正在使用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