首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

winform多线程分块下载文件 -分享解决思路

2014-01-22 
winform多线程分块下载文件 ----分享 public class DownloadThread{private string saveFilePathprivate

winform多线程分块下载文件 ----分享


 public class DownloadThread
    { 
        private string saveFilePath;
        private Uri downUrl;
        private long block;
        private int threadId = -1;
        private long downLength;
        private bool finish = false;
        private FileDownloader downloader;

        public DownloadThread(FileDownloader downloader, Uri downUrl, string saveFile, long block, long downLength, int threadId)
        {
            this.downUrl = downUrl;
            this.saveFilePath = saveFile;
            this.block = block;
            this.downloader = downloader;
            this.threadId = threadId;
            this.downLength = downLength;
        }


        public void ThreadRun()
        {
            //task
            Thread td = new Thread(new ThreadStart(() =>
            {
                Console.WriteLine(threadId.ToString() + " start  " + downLength.ToString() + "      " + block.ToString());
                if (downLength < block)//未下载完成
                {
                    try
                    {
                        int startPos = (int)(block * (threadId - 1) + downLength);//开始位置
                        int endPos = (int)(block * threadId - 1);//结束位置
                        Console.WriteLine("Thread " + this.threadId + " start download from position " + startPos + "  and endwith " + endPos);
                        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downUrl);
                        request.Referer = downUrl.ToString();
                        request.Method = "GET";
                        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.1124)";
                        request.AllowAutoRedirect = false;
                        request.ContentType = "application/octet-stream";
                        request.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
                        request.Timeout = 10 * 1000;
                        request.AllowAutoRedirect = true; 


                        request.AddRange(startPos, endPos);
                        //Console.WriteLine(request.Headers.ToString());
                        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                        WebResponse wb = request.GetResponse();
                        using (Stream _stream = wb.GetResponseStream())
                        { 
                            byte[] buffer = new byte[1024 * 50];
                            long offset = -1;
                            using (Stream threadfile = new FileStream(this.saveFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
                            {
                                threadfile.Seek(startPos, SeekOrigin.Begin);
                                while ((offset = _stream.Read(buffer, 0, buffer.Length)) != 0)
                                {
                                    downloader.append(offset); 
                                    threadfile.Write(buffer, 0, (int)offset);
                                    downLength += offset;
                                    downloader.update(this.threadId, downLength);
                                }
                                threadfile.Close();
                                _stream.Close();
                                Console.WriteLine("Thread " + this.threadId + " download finish");
                                this.finish = true;
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        this.downLength = -1;
                        Console.WriteLine("Thread " + this.threadId + ":" + e.Message);


                    }
                }
                else
                {
                    Console.WriteLine(downLength);
                }
            }));
            td.IsBackground = true;
            td.Start();
        }
        /// <summary>
        /// 下载是否完成
        /// </summary>
        /// <returns></returns>
        public bool isFinish()
        {
            return finish;
        }
        /// <summary> 
        ///  已经下载的内容大小 ;return 如果返回值为-1,代表下载失败
        /// </summary>
        /// <returns></returns>
        public long getDownLength()
        {
            return downLength;
        }

    }



winform多线程分块下载文件 -分享解决思路
winform多线程分块下载文件 -分享解决思路winform多线程分块下载文件 -分享解决思路

不想重新写啦..直接看我博客园的文章吧(不会说我打广告吧.最讨厌了.)
最后有源码
链接地址

[解决办法]
winform多线程分块下载文件 -分享解决思路winform多线程分块下载文件 -分享解决思路winform多线程分块下载文件 -分享解决思路
[解决办法]
winform多线程分块下载文件 -分享解决思路
[解决办法]
非常不错,最近刚好用到,感谢楼主无私分享。
楼下的,技术贴不顶,写代码一堆bug
[解决办法]
学习了,不错的好帖
[解决办法]

[解决办法]
winform多线程分块下载文件 -分享解决思路
[解决办法]
winform多线程分块下载文件 -分享解决思路
nice
[解决办法]
学习了,不错的好帖
[解决办法]
好帖,winform多线程分块下载文件 -分享解决思路,再加一个上传的,winform多线程分块下载文件 -分享解决思路
[解决办法]
,再加一个上传的,winform多线程分块下载文件 -分享解决思路

上传的原理也差不多的嘛
[解决办法]
不错,有空研究下。
[解决办法]
感谢楼主分享winform多线程分块下载文件 -分享解决思路
[解决办法]
看看是什么~
[解决办法]
learning
[解决办法]
winform多线程分块下载文件 -分享解决思路
mark
[解决办法]
winform多线程分块下载文件 -分享解决思路
[解决办法]
   学习了!估计很快就能用得上!
[解决办法]
不错哟  攻城狮很牛x的样子
[解决办法]
下载技术被几家垄断了,由商业利益驱动了,要是不断有高手做些这样的小下载工具就好了
------解决方案--------------------


winform多线程分块下载文件 -分享解决思路
[解决办法]
winform多线程分块下载文件 -分享解决思路
[解决办法]
这个法子真好。
[解决办法]
很专业的说啊
[解决办法]
最近在研究这我喜欢,多谢楼主分享
[解决办法]
必须先顶 后学习
[解决办法]


[解决办法]
winform多线程分块下载文件 -分享解决思路
[解决办法]
学习了,谢谢楼主分享
[解决办法]
好牛X的感觉
[解决办法]
还不错额虚心学习
[解决办法]
不错,可以省点事,最好把限速也做了。
[解决办法]
不错,顶 。。。。。。。。。。。。。。。。。
[解决办法]
学习了!谢谢分享!
[解决办法]
zhichi haowenzhang
[解决办法]
還不錯,收藏起來學習。
謝謝分享

热点排行