我做了一个简单的下载程序,用一个线程循环下载一个文件列表
用下面的方式 不能正确显示下载状态 我对线程不是很了解
请各位高手指点 该怎样做System.Threading.Thread thread001 = null;
DownloadClass dc = new DownloadClass(); //下载类
System.Threading.ThreadStart startDownload = new System.Threading.ThreadStart(dc.DownloadFile);//dc.DownloadFile是下载类中的函数
for (int i = 0; i < rc.Count; i++)
{
thread001 = new System.Threading.Thread(startDownload);
thread001.Start();
}
用下面的方式 不能正确显示下载状态 我对线程不是很了解
请各位高手指点 该怎样做System.Threading.Thread thread001 = null;
DownloadClass dc = new DownloadClass(); //下载类
System.Threading.ThreadStart startDownload = new System.Threading.ThreadStart(dc.DownloadFile);//dc.DownloadFile是下载类中的函数
for (int i = 0; i < rc.Count; i++)
{
thread001 = new System.Threading.Thread(startDownload);
thread001.Start();
}
解决方案 »
- 关于SocketAsyncEventArgs的问题
- 关于ArrayList添加值的问题
- 网页中的img控件,如何自动下载保存
- 菜鸟向老手请教
- 公司里想做个作弊的抽奖程序,请各位高手帮忙!
- 在 VS.NET 2003 上用 VSS 还是 CVS 好?哪里有 VSS 和 CVS 的下载?
- 问一个奇怪的问题,如何在c#里更改access数据库密码?呼唤高手
- Viusal Studio.NET 2003安装程序问题?
- C#反射 Activator.CreateInstance
- C#中使用ADO.NET连接数据库,为何不能引用ADO?也就是using System.Data.ADO死活无法编译,为何?
- 给SQL语句传入参数出错
- 快速比较?
{
Monitor.Enter(this)
// 公共资源处理代码
}
finally
{
Monitor.Exit(this)
}至于显示下载状态不正确,你的需求说明不是很清楚,无法解释
http://www.cnblogs.com/Bird/archive/2007/03/12/671880.html
--------循环调用时--------------------------------------------------------------
for (int i = 0; i < rc.Count; i++)
{
string ss = rc[i].Cells["图幅地址"].Value.ToString();
DownloadClass dc = new DownloadClass();
thread001 = new System.Threading.Thread(new System.Threading.ThreadStart(dc.DownloadFile));
dc.StrUrl = ss;
dc.StrFileName = "f:\\xd_" + rc[i].Cells["图幅编号"].Value.ToString() + ".jpg";
dc.rowNum = i;
thread001.Start(); }
---------下载类------------------------------------------------------------
public class DownloadClass
{
//打开上次下载的文件或新建文件
public string StrUrl;//文件下载网址
public string StrFileName;//下载文件保存地址
public string strError;//返回结果
public long lStartPos =0; //返回上次下载字节
public long lCurrentPos=0;//返回当前下载字节
public long lDownloadFile;//返回当前下载文件长度
public int rowNum = 0; //public static voic SetText(frmMain objForm) //这里传递的是Form1窗体类的一个实例
//{
// objForm.dataGridView2.Rows[3].Cells["文件大小"].Value = a.ToString(); //这样就可以找到我们定义的属性
//} public void DownloadFile()
{
System.IO.FileStream fs;
if (System.IO.File.Exists(StrFileName))
{
fs = System.IO.File.OpenWrite(StrFileName);
lStartPos = fs.Length;
fs.Seek(lStartPos, System.IO.SeekOrigin.Current);
//移动文件流中的当前指针
}
else
{
fs = new System.IO.FileStream(StrFileName, System.IO.FileMode.Create);
lStartPos = 0;
} //打开网络连接
try
{
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);
long length = request.GetResponse().ContentLength;
frmMain.dataGridView2.Rows[rowNum].Cells["文件大小"].Value = length.ToString(); frmMain.dataGridView2.Rows[rowNum].Cells["状态"].Value = "开始下载";
lDownloadFile = length;
if (lStartPos > 0)
request.AddRange((int)lStartPos); //设置Range值 //向服务器请求,获得服务器回应数据流
System.IO.Stream ns = request.GetResponse().GetResponseStream(); byte[] nbytes = new byte[512];
int nReadSize = 0;
nReadSize = ns.Read(nbytes, 0, 512);
while (nReadSize > 0)
{
fs.Write(nbytes, 0, nReadSize);
nReadSize = ns.Read(nbytes, 0, 512);
lCurrentPos = fs.Length;
frmMain.dataGridView2.Rows[rowNum].Cells["已下载"].Value = lCurrentPos.ToString();
frmMain.dataGridView2.Rows[rowNum].Cells["下载进度"].Value = Convert.ToString((lCurrentPos / length) * 100) + "%";
}
if (lCurrentPos == length)
{
frmMain.dataGridView2.Rows[rowNum].Cells["状态"].Value = "完成";
}
else
{
frmMain.dataGridView2.Rows[rowNum].Cells["状态"].Value = "未完成";
} fs.Close();
ns.Close();
strError = "下载完成";
}
catch (Exception ex)
{
fs.Close();
strError = "下载过程中出现错误:" + ex.ToString();
frmMain.dataGridView2.Rows[rowNum].Cells["状态"].Value = "错误下载";
} }
}
//定义下载类结束 主要问题 第一次下载返回的大小都正确 再重新下载时返回的文件大小 全部翻倍了