この問題を 2 ~ 3 時間かけて修正しようとしていますが、修正できません。3 つのパート 3 スレッドでファイルをダウンロードしようとしています。問題は、一部が完了すると、他のスレッドがダウンロードを停止することです。
Example: let's say i want to download 300kb
part1->t1->100kb
part2->t2->100kb //if this thread get completed then other two become unresponsive.
part3->t3->100kb
私が使用しているコード (変更された短いコードですが、私の問題に対処しています)
//inside a function
WebResponse wresp = wreq.GetResponse();
long e1 = wresp.ContentLength / 3;
long e2 = 2*e1;
long e3 = wresp.ContentLength;
wreq.Abort();
wresp.Close();
wreq = null;
wresp = null;
byte[] buff1 = new byte[1500];
byte[] buff2 = new byte[1500];
byte[] buff3 = new byte[1500];
HttpWebRequest hr1 = (HttpWebRequest)WebRequest.Create(textBox1.Text);
hr1.AddRange(0, e1-1);
WebResponse wresp1 = hr1.GetResponse();
HttpWebRequest hr2 = (HttpWebRequest)WebRequest.Create(textBox1.Text);
hr2.AddRange(e1,e2-1);
WebResponse wresp2 = hr2.GetResponse();
HttpWebRequest hr3 = hr1;//(HttpWebRequest)WebRequest.Create(textBox1.Text);
hr3.AddRange(e2,e3);
WebResponse wresp3 = hr3.GetResponse();
Stream response1 = wresp1.GetResponseStream();
Stream response2 = wresp2.GetResponseStream();
Stream response3 = wresp3.GetResponseStream();
Stream f1, f2, f3;
f1 = File.Create("Part1");
f2 = File.Create("Part2");
f3 = File.Create("Part3");
int bytesRead=0, bytesProcessed=0;
long total1=e1, total2=e2-e1, total3=e3-e2;
int x1=0, x2=0, x3=0;
Thread t1 = new Thread(() =>download(hr1, wresp1, buff1,response1,f1,bytesRead, bytesProcessed,total1,x1));
t1.Name = "1";
Thread t2 = new Thread(() => download(hr2, wresp2, buff2, response2, f2, bytesRead, bytesProcessed,total2,x2));
t2.Name = "2";
Thread t3 = new Thread(() => download(hr3, wresp3, buff3, response3, f3, bytesRead, bytesProcessed, total3,x3));
t3.Name = "3";
t1.Start();
t2.Start();
t3.Start();
}
}
}
private download(HttpWebRequest hr2, WebResponse wresp2, byte[] buff, Stream response, Stream f,int bytesRead,long bytesProcessed,long total,int x)
{
do
{
lock (lockerObj)
{
bytesRead = response.Read(buff, 0, buff.Length);
bytesProcessed += bytesRead;
f.Write(buff, 0, bytesRead);
x = Convert.ToInt32(Thread.CurrentThread.Name) - 1;
pb[x].Invoke((Action)delegate
{
pb[x].Value = Convert.ToInt32(bytesProcessed * 100 / total);
});
if (bytesProcessed >= total)
{
Thread.CurrentThread.Abort();
break;
}
lb[x].Invoke((Action)delegate
{
lb[x].Text = "Downloaded " + Convert.ToDouble((bytesProcessed * 100 / total)).ToString() + "%";
label4.Text = "thread" + (x + 1);
});
}
} while (bytesProcessed<=total && bytesRead>=0 );
}
static readonly Object lockerObj=new Object(); //at global level
アプリケーション UI は応答性を維持し、デバッグから、各スレッドが同時に終了していることに気付きました。したがって、問題は、他のスレッドがその部分を完了していない理由です。