【发布时间】:2014-10-14 05:45:31
【问题描述】:
我正在尝试制作一个简单的下载管理器。它可以工作。问题是如果我添加一个进度条来通知用户我会收到此异常
此流不支持查找操作
while ((readed = ReadFrom.Read(read, 0, read.Length)) > 0)
{
strLocal.Write(read, 0, readed);
**UpdateProgress(ReadFrom.Length, strLocal.Length);// throws exception**
}
这是所有代码
private void button1_Click(object sender, EventArgs e)
{
req = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
res = (HttpWebResponse)req.GetResponse();
Int64 contentlength = res.ContentLength;
WebClient wc = new WebClient();
Stream ReadFrom= wc.OpenRead(new Uri(url));
strLocal = new FileStream(@"E:\\xxx.tar.gz", FileMode.Create, FileAccess.Write, FileShare.None);
byte[]read=new byte[1024];
int readed = 0;
while ((readed = ReadFrom.Read(read, 0, read.Length)) > 0)
{
strLocal.Write(read, 0, readed);
UpdateProgress(ReadFrom.Length, strLocal.Length);
}
strLocal.Close();
ReadFrom.Close();
}
private void UpdateProgress(long Filesize, long readedBytes)
{
// progressBar1.Maximum = 100;
int downloaded =Convert.ToInt32((readedBytes * 100) / Filesize);
progressBar1.Value = downloaded;
}
这里有什么问题?
@编辑
HttpWebRequest req;
HttpWebResponse res;
Stream strLocal;
Stream ResponseStr;
byte[] bytes = null;
Thread thr;
delegate void UpdateCallBack(long l1, long l2);
public Form1()
{
InitializeComponent();
}
string url="https://www.unrealircd.org/downloads/Unreal3.2.10.3.tar.gz";
////string url2 = "http://www.microsoft.com/en-us/download/confirmation.aspx?id=34794&6B49FDFB-8E5B-4B07-BC31-15695C5A2143=1";
string filename = @"C:\\Unreal3.2.10.3.tar.gz";
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
thr = new Thread(download);
thr.Start();
}
private void download()
{
req = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
res = (HttpWebResponse)req.GetResponse();
Int64 contentlength = res.ContentLength;
ResponseStr = res.GetResponseStream();
strLocal = new FileStream(@"E:\\xxx.tar.gz", FileMode.Create, FileAccess.Write, FileShare.None);
byte[]read=new byte[1024];
int readed = 0;
while ((readed = ResponseStr.Read(read, 0, read.Length)) > 0)
{
strLocal.Write(read, 0, readed);
this.Invoke(new UpdateCallBack(this.UpdateProgress), new object[] {ResponseStr.Length,strLocal.Length });
}
strLocal.Close();
ResponseStr.Close();
}
private void UpdateProgress(long Filesize, long readedBytes)
{
int updated =Convert.ToInt32((readedBytes * 100) / Filesize);
progressBar1.Value = updated;
}
@edit2
private void download()
{
req = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
res = (HttpWebResponse)req.GetResponse();
Int64 contentlength = res.ContentLength;
ResponseStr = res.GetResponseStream();
strLocal = new FileStream(@"E:\\xxx.tar.gz", FileMode.Create, FileAccess.Write, FileShare.None);
byte[]read=new byte[1024];
int readed = 0;
while ((readed = ResponseStr.Read(read, 0, read.Length)) > 0)
{
strLocal.Write(read, 0, readed);
backgroundWorker1.RunWorkerAsync();
// this.Invoke(new UpdateCallBack(this.UpdateProgress), new object[] {ResponseStr.Length,strLocal.Length });
}
strLocal.Close();
ResponseStr.Close();
}
private void UpdateProgress(long Filesize, long readedBytes)
{
int updated =Convert.ToInt32((readedBytes * 100) / Filesize);
progressBar1.Value = updated;
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
UpdateProgress(ResponseStr.Length, strLocal.Length);
}
【问题讨论】:
-
我猜这里存在线程问题。您是否尝试过使用 BackgroundWorker 来代替
-
您在 UI 线程上进行所有处理。所以进度条无法更新。
-
有什么异常?你的progressBar1 的属性是什么(比如MaxValue)
标签: c#