• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

请教循环中的线程问题

yzlz888 2007-06-01 04:15:03
我做了一个简单的下载程序,用一个线程循环下载一个文件列表
用下面的方式 不能正确显示下载状态 我对线程不是很了解
请各位高手指点 该怎样做

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();
}
...全文
194 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yzlz888 2007-06-02
已解决 结贴散分
回复
dly0411 2007-06-01
good good study !day day up!
回复
yzlz888 2007-06-01
贴出全部代码 请大家帮忙
--------循环调用时--------------------------------------------------------------
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 = "错误下载";
}

}
} 
//定义下载类结束

主要问题 第一次下载返回的大小都正确 再重新下载时返回的文件大小 全部翻倍了
回复
zhaochong12 2007-06-01
这种下载的可以考虑一下线程池
http://www.cnblogs.com/Bird/archive/2007/03/12/671880.html
回复
magicsnake 2007-06-01
Monitor用法

try
{
Monitor.Enter(this)
// 公共资源处理代码
}
finally
{
Monitor.Exit(this)
}

至于显示下载状态不正确,你的需求说明不是很清楚,无法解释
回复
impeller 2007-06-01
检查DownloadFile到本地是不是路径一样
回复
yzlz888 2007-06-01
这种单一线程循环方式怎么用Mutex?
回复
duke731 2007-06-01
LS说的对
回复
wzd24 2007-06-01
有没有冲突要看你的DownloadFile方法是怎么实现的。如果有冲突的话,可以使用互斥锁。
回复
yzlz888 2007-06-01
好像这样写 一个线程没有结束 另一个就开始了 是不是有冲突问题?要怎样解决?
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2007-06-01 04:15
社区公告

让您成为最强悍的C#开发者