Здравствуйте.
Есть такие сайты, с которых ну просто ооооооочень медленно качается (почему-то). Но при этом поддерживается многопоточное скачивание (почему-то).
Вот накидал код:
public partial class Form1 : Form
{
public class ThreadDownload
{
public ThreadDownload()
{
}
public void SetRange(Int64 byteFrom, Int64 byteTo)
{
}
public void Run()
{
FileDownloader downloader = new FileDownloader();
downloader.OnWorkProgress += EventWork;
//тут скачиваем кусок файла и каждые N байт синхронизируемся
}
private void EventWork(object sender, Int64 bytesTransfered)
{
//тут надо как-то пройтись по всем потокам и узнать, сколько они скачали
//и вывести это на форму
}
}
public class ThreadFather
{
public string url;
public string outputFileName;
public int threadCount;
private List<ThreadDownload> threads = new List<ThreadDownload>();
public ThreadFather()
{
}
public void Run()
{
//TODO: получить размер скачиваемого файла
for (int i = 0; i < threadCount; i++)
{
ThreadDownload thr = new ThreadDownload();
//TODO: вычислить позицию каждого куска
thr.SetRange(0, 1023);
threads.Add(thr);
}
for (int i = 0; i < threads.Count; i++)
{
Thread thread = new Thread(threads[i].Run);
//TODO: создать обработчики событий
thread.Start();
}
//как подождать, пока все потоки докачаются?
//TODO: склеить все куски в один файл
}
}
private void btnDownload_Click(object sender, EventArgs e)
{
ThreadFather father = new ThreadFather();
father.url = "some url";
Thread thread = new Thread(father.Run);
thread.Start();
}
}
Проблема здесь
private void EventWork(object sender, Int64 bytesTransfered)
{
//тут надо как-то пройтись по всем потокам и узнать, сколько они скачали
//и вывести это на форму
}
}
Как качающий поток узнает об остальных качающих потоках? Получается, что в качающие потоки надо передавать указатель на коллекцию потоков из фазера? Но ведь тогда получится обращение к переменной из разных потоков. Как правильно сделать такую синхронизацию?