<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; fzzsh</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/fzzsh/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 13:40:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>一个简单的C#多线程间同步的例子</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/02/16/c-6/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/02/16/c-6/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 06:50:02 +0000</pubDate>
		<dc:creator>fzzsh</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/02/16/c-6/</guid>
		<description><![CDATA[在开发中经常会遇到线程的例子，如果某个后台操作比较费时间，我们就可以启动一个线程去执行那个费时的操作，同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题，下面的例子就展示了在两个线程之间如何协同工作。 这个程序的思路是共同做一件事情（从一个ArrayList中删除元素）,如果执行完成了，两个线程都停止执行。 代码如下： using System; using System.Collections; using System.Collections.Generic; using System.Threading; /// /// 在开发中经常会遇到线程的例子，如果某个后台操作比较费时间，我们就可以启动一个线程去执行那个费时的操作，同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题，下面的例子就展示了在两个线程之间如何协同工作。 /// ///这个程序的思路是共同做一件事情（从一个ArrayList中删除元素）,如果执行完成了，两个线程都停止执行。 ///作者：周公 /// 时间：2008-5-17 /// 原发地址：http://blog.csdn.net/zhoufoxcn /// public class ThreadDemo { private Thread threadOne; private Thread threadTwo; private ArrayList stringList; private event EventHandler OnNumberClear;//数据删除完成引发的事件 public static void Main() { ThreadDemo demo = new ThreadDemo(1000); demo.Action(); } public ThreadDemo(int number) { [...]]]></description>
			<content:encoded><![CDATA[<p>在开发中经常会遇到线程的例子，如果某个后台操作比较费时间，我们就可以启动一个线程去执行那个费时的操作，同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题，下面的例子就展示了在两个线程之间如何协同工作。</p>
<p>这个程序的思路是共同做一件事情（从一个ArrayList中删除元素）,如果执行完成了，两个线程都停止执行。</p>
<p>代码如下：</p>
<p>using System;<br />
using System.Collections;<br />
using System.Collections.Generic;<br />
using System.Threading;</p>
<p>///<br />
/// 在开发中经常会遇到线程的例子，如果某个后台操作比较费时间，我们就可以启动一个线程去执行那个费时的操作，同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题，下面的例子就展示了在两个线程之间如何协同工作。<br />
///<br />
///这个程序的思路是共同做一件事情（从一个ArrayList中删除元素）,如果执行完成了，两个线程都停止执行。<br />
///作者：周公<br />
/// 时间：2008-5-17<br />
/// 原发地址：http://blog.csdn.net/zhoufoxcn<br />
///<br />
public class ThreadDemo<br />
{<br />
private Thread threadOne;<br />
private Thread threadTwo;<br />
private ArrayList stringList;<br />
private event EventHandler OnNumberClear;//数据删除完成引发的事件<br />
public static void Main()<br />
{<br />
ThreadDemo demo = new ThreadDemo(1000);<br />
demo.Action();<br />
}<br />
public ThreadDemo(int number)<br />
{<br />
Random random = new Random(1000000);<br />
stringList = new ArrayList(number);<br />
for (int i = 0; i &lt; number; i++)<br />
{<br />
stringList.Add(random.Next().ToString());<br />
}<br />
threadOne = new Thread(new ThreadStart(Run));//两个线程共同做一件事情<br />
threadTwo = new Thread(new ThreadStart(Run));//两个线程共同做一件事情<br />
threadOne.Name = "线程1";<br />
threadTwo.Name = "线程2";<br />
OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear);</p>
<p>}<br />
///<br />
/// 开始工作<br />
///<br />
public void Action()<br />
{<br />
threadOne.Start();<br />
threadTwo.Start();<br />
}<br />
///<br />
/// 共同做的工作<br />
///<br />
private void Run()<br />
{<br />
string stringValue = null;<br />
while (true)<br />
{<br />
Monitor.Enter(this);//锁定，保持同步<br />
stringValue = (string)stringList[0];<br />
Console.WriteLine(Thread.CurrentThread.Name + "删除了" + stringValue);<br />
stringList.RemoveAt(0);//删除ArrayList中的元素<br />
if (stringList.Count == 0)<br />
{<br />
OnNumberClear(this, new EventArgs());//引发完成事件<br />
}<br />
Monitor.Exit(this);//取消锁定<br />
Thread.Sleep(5);<br />
}<br />
}</p>
<p>//执行完成之后，停止所有线程<br />
void ThreadDemo_OnNumberClear(object sender, EventArgs e)<br />
{<br />
Console.WriteLine("执行完了，停止了所有线程的执行。");<br />
threadTwo.Abort();<br />
threadOne.Abort();</p>
<p>}<br />
}<br />
说明：要实现线程同步不止这一种方式。在这里采用了事件，在事件处理程序里中止了线程（主要是回答csdn论坛的一个朋友的问题才用了这种办法）。<br />
<a href="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/ThreadDemo.JPG"><img class="alignnone" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/ThreadDemo.JPG" alt="" width="669" height="438" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/02/16/c-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>实现支持断点续传多线程下载的 Http Web 客户端工具类</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/02/16/http-web/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/02/16/http-web/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 06:16:34 +0000</pubDate>
		<dc:creator>fzzsh</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/02/16/http-web/</guid>
		<description><![CDATA[/* .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient) * Reflector 了一下 System.Net.WebClient ,改写或增加了若干: * DownLoad、Upload 相关方法! * DownLoad 相关改动较大! * 增加了 DataReceive、ExceptionOccurrs 事件! * 了解服务器端与客户端交互的 HTTP 协议参阅: * 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! JSP/Servlet 实现! * http://blog.csdn.net/playyuer/archive/2004/08/02/58430.aspx * 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现! * http://blog.csdn.net/playyuer/archive/2004/08/02/58281.aspx */ 2005-03-14 修订: /* .Net/C#: 实现支持断点续传多线程下载的工具类 * Reflector 了一下 System.Net.WebClient ,改写或增加了若干: [...]]]></description>
			<content:encoded><![CDATA[<p>/* .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)<br />
* Reflector 了一下 System.Net.WebClient ,改写或增加了若干:<br />
* DownLoad、Upload 相关方法!<br />
* DownLoad 相关改动较大!<br />
* 增加了 DataReceive、ExceptionOccurrs 事件!<br />
* 了解服务器端与客户端交互的 HTTP 协议参阅:<br />
* 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! JSP/Servlet 实现!<br />
* http://blog.csdn.net/playyuer/archive/2004/08/02/58430.aspx<br />
* 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现!<br />
* http://blog.csdn.net/playyuer/archive/2004/08/02/58281.aspx<br />
*/</p>
<p>2005-03-14 修订:</p>
<p>/* .Net/C#: 实现支持断点续传多线程下载的工具类<br />
* Reflector 了一下 System.Net.WebClient ,改写或增加了若干:<br />
* DownLoad、Upload 相关方法!<br />
* 增加了 DataReceive、ExceptionOccurrs　事件<br />
*/</p>
<p>namespace Microshaoft.Utils<br />
{<br />
using System;<br />
using System.IO;<br />
using System.Net;<br />
using System.Text;<br />
using System.Security;<br />
using System.Threading;<br />
using System.Collections.Specialized;</p>
<p>///<br />
/// 记录下载的字节位置<br />
///<br />
public class DownLoadState<br />
{<br />
private string _FileName;</p>
<p>private string _AttachmentName;<br />
private int _Position;<br />
private string _RequestURL;<br />
private string _ResponseURL;<br />
private int _Length;</p>
<p>private byte[] _Data;</p>
<p>public string FileName<br />
{<br />
get<br />
{<br />
return _FileName;<br />
}<br />
}</p>
<p>public int Position<br />
{<br />
get<br />
{<br />
return _Position;<br />
}<br />
}</p>
<p>public int Length<br />
{<br />
get<br />
{<br />
return _Length;<br />
}<br />
}</p>
<p>public string AttachmentName<br />
{<br />
get<br />
{<br />
return _AttachmentName;<br />
}<br />
}</p>
<p>public string RequestURL<br />
{<br />
get<br />
{<br />
return _RequestURL;<br />
}<br />
}</p>
<p>public string ResponseURL<br />
{<br />
get<br />
{<br />
return _ResponseURL;<br />
}<br />
}</p>
<p>public byte[] Data<br />
{<br />
get<br />
{<br />
return _Data;<br />
}<br />
}</p>
<p>internal DownLoadState(string RequestURL, string ResponseURL, string FileName, string AttachmentName, int Position, int Length, byte[] Data)<br />
{<br />
this._FileName = FileName;<br />
this._RequestURL = RequestURL;<br />
this._ResponseURL = ResponseURL;<br />
this._AttachmentName = AttachmentName;<br />
this._Position = Position;<br />
this._Data = Data;<br />
this._Length = Length;<br />
}</p>
<p>internal DownLoadState(string RequestURL, string ResponseURL, string FileName, string AttachmentName, int Position, int Length, ThreadCallbackHandler tch)<br />
{<br />
this._RequestURL = RequestURL;<br />
this._ResponseURL = ResponseURL;<br />
this._FileName = FileName;<br />
this._AttachmentName = AttachmentName;<br />
this._Position = Position;<br />
this._Length = Length;<br />
this._ThreadCallback = tch;<br />
}</p>
<p>internal DownLoadState(string RequestURL, string ResponseURL, string FileName, string AttachmentName, int Position, int Length)<br />
{<br />
this._RequestURL = RequestURL;<br />
this._ResponseURL = ResponseURL;<br />
this._FileName = FileName;<br />
this._AttachmentName = AttachmentName;<br />
this._Position = Position;<br />
this._Length = Length;<br />
}</p>
<p>private ThreadCallbackHandler _ThreadCallback;</p>
<p>public HttpWebClient httpWebClient<br />
{<br />
get<br />
{<br />
return this._hwc;<br />
}<br />
set<br />
{<br />
this._hwc = value;<br />
}<br />
}</p>
<p>internal Thread thread<br />
{<br />
get<br />
{<br />
return _thread;<br />
}<br />
set<br />
{<br />
_thread = value;<br />
}<br />
}</p>
<p>private HttpWebClient _hwc;<br />
private Thread _thread;</p>
<p>//<br />
internal void StartDownloadFileChunk()<br />
{<br />
if (this._ThreadCallback != null)<br />
{<br />
this._ThreadCallback(this._RequestURL, this._FileName, this._Position, this._Length);<br />
this._hwc.OnThreadProcess(this._thread);<br />
}<br />
}</p>
<p>}</p>
<p>//委托代理线程的所执行的方法签名一致<br />
public delegate void ThreadCallbackHandler(string S, string s, int I, int i);</p>
<p>//异常处理动作<br />
public enum ExceptionActions<br />
{<br />
Throw,<br />
CancelAll,<br />
Ignore,<br />
Retry<br />
}</p>
<p>///<br />
/// 包含 Exception 事件数据的类<br />
///<br />
public class ExceptionEventArgs : System.EventArgs<br />
{<br />
private System.Exception _Exception;<br />
private ExceptionActions _ExceptionAction;</p>
<p>private DownLoadState _DownloadState;</p>
<p>public DownLoadState DownloadState<br />
{<br />
get<br />
{<br />
return _DownloadState;<br />
}<br />
}</p>
<p>public Exception Exception<br />
{<br />
get<br />
{<br />
return _Exception;<br />
}<br />
}</p>
<p>public ExceptionActions ExceptionAction<br />
{<br />
get<br />
{<br />
return _ExceptionAction;<br />
}<br />
set<br />
{<br />
_ExceptionAction = value;<br />
}<br />
}</p>
<p>internal ExceptionEventArgs(System.Exception e, DownLoadState DownloadState)<br />
{<br />
this._Exception = e;<br />
this._DownloadState = DownloadState;<br />
}<br />
}</p>
<p>///<br />
/// 包含 DownLoad 事件数据的类<br />
///<br />
public class DownLoadEventArgs : System.EventArgs<br />
{<br />
private DownLoadState _DownloadState;</p>
<p>public DownLoadState DownloadState<br />
{<br />
get<br />
{<br />
return _DownloadState;<br />
}<br />
}</p>
<p>public DownLoadEventArgs(DownLoadState DownloadState)<br />
{<br />
this._DownloadState = DownloadState;<br />
}</p>
<p>}</p>
<p>public class ThreadProcessEventArgs : System.EventArgs<br />
{<br />
private Thread _thread;</p>
<p>public Thread thread<br />
{<br />
get<br />
{<br />
return this._thread;<br />
}<br />
}</p>
<p>public ThreadProcessEventArgs(Thread thread)<br />
{<br />
this._thread = thread;<br />
}</p>
<p>}</p>
<p>///<br />
/// 支持断点续传多线程下载的类<br />
///<br />
public class HttpWebClient<br />
{<br />
private static object _SyncLockObject = new object();</p>
<p>public delegate void DataReceiveEventHandler(HttpWebClient Sender, DownLoadEventArgs e);</p>
<p>public event DataReceiveEventHandler DataReceive; //接收字节数据事件</p>
<p>public delegate void ExceptionEventHandler(HttpWebClient Sender, ExceptionEventArgs e);</p>
<p>public event ExceptionEventHandler ExceptionOccurrs; //发生异常事件</p>
<p>public delegate void ThreadProcessEventHandler(HttpWebClient Sender, ThreadProcessEventArgs e);</p>
<p>public event ThreadProcessEventHandler ThreadProcessEnd; //发生多线程处理完毕事件</p>
<p>private int _FileLength; //下载文件的总大小</p>
<p>public int FileLength<br />
{<br />
get<br />
{<br />
return _FileLength;<br />
}<br />
}</p>
<p>///<br />
/// 分块下载文件<br />
///<br />
/// URL 地址<br />
/// 保存到本地的路径文件名<br />
/// 块数,线程数<br />
public void DownloadFile(string Address, string FileName, int ChunksCount)<br />
{<br />
int p = 0; // position<br />
int s = 0; // chunk size<br />
string a = null;<br />
HttpWebRequest hwrq;<br />
HttpWebResponse hwrp = null;<br />
try<br />
{<br />
hwrq = (HttpWebRequest) WebRequest.Create(this.GetUri(Address));<br />
hwrp = (HttpWebResponse) hwrq.GetResponse();<br />
long L = hwrp.ContentLength;</p>
<p>hwrq.Credentials = this.m_credentials;</p>
<p>L = ((L == -1) || (L &gt; 0x7fffffff)) ? ((long) 0x7fffffff) : L; //Int32.MaxValue 该常数的值为 2,147,483,647; 即十六进制的 0x7FFFFFFF</p>
<p>int l = (int) L;</p>
<p>this._FileLength = l;</p>
<p>// 在本地预定空间(竟然在多线程下不用先预定空间)<br />
// FileStream sw = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);<br />
// sw.Write(new byte[l], 0, l);<br />
// sw.Close();<br />
// sw = null;</p>
<p>bool b = (hwrp.Headers["Accept-Ranges"] != null &amp; hwrp.Headers["Accept-Ranges"] == "bytes");<br />
a = hwrp.Headers["Content-Disposition"]; //attachment<br />
if (a != null)<br />
{<br />
a = a.Substring(a.LastIndexOf("filename=") + 9);<br />
}<br />
else<br />
{<br />
a = FileName;<br />
}</p>
<p>int ss = s;<br />
if (b)<br />
{<br />
s = l / ChunksCount;<br />
if (s s)<br />
{<br />
l -= s;<br />
if (l 0)<br />
{<br />
DownLoadState x = new DownLoadState(Address, hwrp.ResponseUri.AbsolutePath, FileName, a, p, s, new ThreadCallbackHandler(this.DownloadFileChunk));<br />
// 单线程下载<br />
// x.StartDownloadFileChunk();</p>
<p>x.httpWebClient = this;<br />
//多线程下载<br />
Thread t = new Thread(new ThreadStart(x.StartDownloadFileChunk));<br />
//this.OnThreadProcess(t);<br />
t.Start();</p>
<p>}<br />
p += s;<br />
}<br />
s = ss;<br />
byte[] buffer = this.ResponseAsBytes(Address, hwrp, s, FileName);<br />
this.OnThreadProcess(Thread.CurrentThread);</p>
<p>// lock (_SyncLockObject)<br />
// {<br />
// this._Bytes += buffer.Length;<br />
// }<br />
}<br />
}<br />
catch (Exception e)<br />
{<br />
ExceptionActions ea = ExceptionActions.Throw;<br />
if (this.ExceptionOccurrs != null)<br />
{<br />
DownLoadState x = new DownLoadState(Address, hwrp.ResponseUri.AbsolutePath, FileName, a, p, s);<br />
ExceptionEventArgs eea = new ExceptionEventArgs(e, x);<br />
ExceptionOccurrs(this, eea);<br />
ea = eea.ExceptionAction;<br />
}</p>
<p>if (ea == ExceptionActions.Throw)<br />
{<br />
if (!(e is WebException) &amp;&amp; !(e is SecurityException))<br />
{<br />
throw new WebException("net_webclient", e);<br />
}<br />
throw;<br />
}<br />
}</p>
<p>}</p>
<p>internal void OnThreadProcess(Thread t)<br />
{<br />
if (ThreadProcessEnd != null)<br />
{<br />
ThreadProcessEventArgs tpea = new ThreadProcessEventArgs(t);<br />
ThreadProcessEnd(this, tpea);<br />
}<br />
}</p>
<p>///<br />
/// 下载一个文件块,利用该方法可自行实现多线程断点续传<br />
///<br />
/// URL 地址<br />
/// 保存到本地的路径文件名<br />
/// 块大小<br />
public void DownloadFileChunk(string Address, string FileName, int FromPosition, int Length)<br />
{<br />
HttpWebResponse hwrp = null;<br />
string a = null;<br />
try<br />
{<br />
//this._FileName = FileName;<br />
HttpWebRequest hwrq = (HttpWebRequest) WebRequest.Create(this.GetUri(Address));<br />
//hwrq.Credentials = this.m_credentials;<br />
hwrq.AddRange(FromPosition);<br />
hwrp = (HttpWebResponse) hwrq.GetResponse();<br />
a = hwrp.Headers["Content-Disposition"]; //attachment<br />
if (a != null)<br />
{<br />
a = a.Substring(a.LastIndexOf("filename=") + 9);<br />
}<br />
else<br />
{<br />
a = FileName;<br />
}</p>
<p>byte[] buffer = this.ResponseAsBytes(Address, hwrp, Length, FileName);<br />
// lock (_SyncLockObject)<br />
// {<br />
// this._Bytes += buffer.Length;<br />
// }<br />
}<br />
catch (Exception e)<br />
{<br />
ExceptionActions ea = ExceptionActions.Throw;<br />
if (this.ExceptionOccurrs != null)<br />
{<br />
DownLoadState x = new DownLoadState(Address, hwrp.ResponseUri.AbsolutePath, FileName, a, FromPosition, Length);<br />
ExceptionEventArgs eea = new ExceptionEventArgs(e, x);<br />
ExceptionOccurrs(this, eea);<br />
ea = eea.ExceptionAction;<br />
}</p>
<p>if (ea == ExceptionActions.Throw)<br />
{<br />
if (!(e is WebException) &amp;&amp; !(e is SecurityException))<br />
{<br />
throw new WebException("net_webclient", e);<br />
}<br />
throw;<br />
}<br />
}<br />
}</p>
<p>internal byte[] ResponseAsBytes(string RequestURL, WebResponse Response, long Length, string FileName)<br />
{<br />
string a = null; //AttachmentName<br />
int P = 0; //整个文件的位置指针<br />
int num2 = 0;<br />
try<br />
{<br />
a = Response.Headers["Content-Disposition"]; //attachment<br />
if (a != null)<br />
{<br />
a = a.Substring(a.LastIndexOf("filename=") + 9);<br />
}</p>
<p>long num1 = Length; //Response.ContentLength;<br />
bool flag1 = false;<br />
if (num1 == -1)<br />
{<br />
flag1 = true;<br />
num1 = 0x10000; //64k<br />
}<br />
byte[] buffer1 = new byte[(int) num1];</p>
<p>int p = 0; //本块的位置指针</p>
<p>string s = Response.Headers["Content-Range"];<br />
if (s != null)<br />
{<br />
s = s.Replace("bytes ", "");<br />
s = s.Substring(0, s.IndexOf("-"));<br />
P = Convert.ToInt32(s);<br />
}<br />
int num3 = 0;</p>
<p>Stream S = Response.GetResponseStream();<br />
do<br />
{<br />
num2 = S.Read(buffer1, num3, ((int) num1) - num3);</p>
<p>num3 += num2;<br />
if (flag1 &amp;&amp; (num3 == num1))<br />
{<br />
num1 += 0x10000;<br />
byte[] buffer2 = new byte[(int) num1];<br />
Buffer.BlockCopy(buffer1, 0, buffer2, 0, num3);<br />
buffer1 = buffer2;<br />
}</p>
<p>// lock (_SyncLockObject)<br />
// {<br />
// this._bytes += num2;<br />
// }<br />
if (num2 &gt; 0)<br />
{<br />
if (this.DataReceive != null)<br />
{<br />
byte[] buffer = new byte[num2];<br />
Buffer.BlockCopy(buffer1, p, buffer, 0, buffer.Length);<br />
DownLoadState dls = new DownLoadState(RequestURL, Response.ResponseUri.AbsolutePath, FileName, a, P, num2, buffer);<br />
DownLoadEventArgs dlea = new DownLoadEventArgs(dls);<br />
//触发事件<br />
this.OnDataReceive(dlea);<br />
//System.Threading.Thread.Sleep(100);</p>
<p>}<br />
p += num2; //本块的位置指针<br />
P += num2; //整个文件的位置指针<br />
}<br />
else<br />
{<br />
break;<br />
}</p>
<p>}<br />
while (num2 != 0);</p>
<p>S.Close();<br />
S = null;<br />
if (flag1)<br />
{<br />
byte[] buffer3 = new byte[num3];<br />
Buffer.BlockCopy(buffer1, 0, buffer3, 0, num3);<br />
buffer1 = buffer3;<br />
}<br />
return buffer1;<br />
}<br />
catch (Exception e)<br />
{<br />
ExceptionActions ea = ExceptionActions.Throw;<br />
if (this.ExceptionOccurrs != null)<br />
{<br />
DownLoadState x = new DownLoadState(RequestURL, Response.ResponseUri.AbsolutePath, FileName, a, P, num2);<br />
ExceptionEventArgs eea = new ExceptionEventArgs(e, x);<br />
ExceptionOccurrs(this, eea);<br />
ea = eea.ExceptionAction;<br />
}</p>
<p>if (ea == ExceptionActions.Throw)<br />
{<br />
if (!(e is WebException) &amp;&amp; !(e is SecurityException))<br />
{<br />
throw new WebException("net_webclient", e);<br />
}<br />
throw;<br />
}<br />
return null;<br />
}<br />
}</p>
<p>private void OnDataReceive(DownLoadEventArgs e)<br />
{<br />
//触发数据到达事件<br />
DataReceive(this, e);<br />
}</p>
<p>public byte[] UploadFile(string address, string fileName)<br />
{<br />
return this.UploadFile(address, "POST", fileName, "file");<br />
}</p>
<p>public string UploadFileEx(string address, string method, string fileName, string fieldName)<br />
{<br />
return Encoding.ASCII.GetString(UploadFile(address, method, fileName, fieldName));<br />
}</p>
<p>public byte[] UploadFile(string address, string method, string fileName, string fieldName)<br />
{<br />
byte[] buffer4;<br />
FileStream stream1 = null;<br />
try<br />
{<br />
fileName = Path.GetFullPath(fileName);<br />
string text1 = "---------------------" + DateTime.Now.Ticks.ToString("x");</p>
<p>string text2 = "application/octet-stream";</p>
<p>stream1 = new FileStream(fileName, FileMode.Open, FileAccess.Read);<br />
WebRequest request1 = WebRequest.Create(this.GetUri(address));<br />
request1.Credentials = this.m_credentials;<br />
request1.ContentType = "multipart/form-data; boundary=" + text1;</p>
<p>request1.Method = method;<br />
string[] textArray1 = new string[7] {"--", text1, "\r\nContent-Disposition: form-data; name=\"" + fieldName + "\"; filename=\"", Path.GetFileName(fileName), "\"\r\nContent-Type: ", text2, "\r\n\r\n"};<br />
string text3 = string.Concat(textArray1);<br />
byte[] buffer1 = Encoding.UTF8.GetBytes(text3);<br />
byte[] buffer2 = Encoding.ASCII.GetBytes("\r\n--" + text1 + "\r\n");<br />
long num1 = 0x7fffffffffffffff;<br />
try<br />
{<br />
num1 = stream1.Length;<br />
request1.ContentLength = (num1 + buffer1.Length) + buffer2.Length;<br />
}<br />
catch<br />
{<br />
}<br />
byte[] buffer3 = new byte[Math.Min(0x2000, (int) num1)];<br />
using (Stream stream2 = request1.GetRequestStream())<br />
{<br />
int num2;<br />
stream2.Write(buffer1, 0, buffer1.Length);<br />
do<br />
{<br />
num2 = stream1.Read(buffer3, 0, buffer3.Length);<br />
if (num2 != 0)<br />
{<br />
stream2.Write(buffer3, 0, num2);<br />
}<br />
}<br />
while (num2 != 0);<br />
stream2.Write(buffer2, 0, buffer2.Length);<br />
}<br />
stream1.Close();<br />
stream1 = null;<br />
WebResponse response1 = request1.GetResponse();</p>
<p>buffer4 = this.ResponseAsBytes(response1);<br />
}<br />
catch (Exception exception1)<br />
{<br />
if (stream1 != null)<br />
{<br />
stream1.Close();<br />
stream1 = null;<br />
}<br />
if (!(exception1 is WebException) &amp;&amp; !(exception1 is SecurityException))<br />
{<br />
//throw new WebException(SR.GetString("net_webclient"), exception1);<br />
throw new WebException("net_webclient", exception1);<br />
}<br />
throw;<br />
}<br />
return buffer4;<br />
}</p>
<p>private byte[] ResponseAsBytes(WebResponse response)<br />
{<br />
int num2;<br />
long num1 = response.ContentLength;<br />
bool flag1 = false;<br />
if (num1 == -1)<br />
{<br />
flag1 = true;<br />
num1 = 0x10000;<br />
}<br />
byte[] buffer1 = new byte[(int) num1];<br />
Stream stream1 = response.GetResponseStream();<br />
int num3 = 0;<br />
do<br />
{<br />
num2 = stream1.Read(buffer1, num3, ((int) num1) - num3);<br />
num3 += num2;<br />
if (flag1 &amp;&amp; (num3 == num1))<br />
{<br />
num1 += 0x10000;<br />
byte[] buffer2 = new byte[(int) num1];<br />
Buffer.BlockCopy(buffer1, 0, buffer2, 0, num3);<br />
buffer1 = buffer2;<br />
}<br />
}<br />
while (num2 != 0);<br />
stream1.Close();<br />
if (flag1)<br />
{<br />
byte[] buffer3 = new byte[num3];<br />
Buffer.BlockCopy(buffer1, 0, buffer3, 0, num3);<br />
buffer1 = buffer3;<br />
}<br />
return buffer1;<br />
}</p>
<p>private NameValueCollection m_requestParameters;<br />
private Uri m_baseAddress;<br />
private ICredentials m_credentials = CredentialCache.DefaultCredentials;</p>
<p>public ICredentials Credentials<br />
{<br />
get<br />
{<br />
return this.m_credentials;<br />
}<br />
set<br />
{<br />
this.m_credentials = value;<br />
}<br />
}</p>
<p>public NameValueCollection QueryString<br />
{<br />
get<br />
{<br />
if (this.m_requestParameters == null)<br />
{<br />
this.m_requestParameters = new NameValueCollection();<br />
}<br />
return this.m_requestParameters;<br />
}<br />
set<br />
{<br />
this.m_requestParameters = value;<br />
}<br />
}</p>
<p>public string BaseAddress<br />
{<br />
get<br />
{<br />
if (this.m_baseAddress != null)<br />
{<br />
return this.m_baseAddress.ToString();<br />
}<br />
return string.Empty;<br />
}<br />
set<br />
{<br />
if ((value == null) || (value.Length == 0))<br />
{<br />
this.m_baseAddress = null;<br />
}<br />
else<br />
{<br />
try<br />
{<br />
this.m_baseAddress = new Uri(value);<br />
}<br />
catch (Exception exception1)<br />
{<br />
throw new ArgumentException("value", exception1);<br />
}<br />
}<br />
}<br />
}</p>
<p>private Uri GetUri(string path)<br />
{<br />
Uri uri1;<br />
try<br />
{<br />
if (this.m_baseAddress != null)<br />
{<br />
uri1 = new Uri(this.m_baseAddress, path);<br />
}<br />
else<br />
{<br />
uri1 = new Uri(path);<br />
}<br />
if (this.m_requestParameters == null)<br />
{<br />
return uri1;<br />
}<br />
StringBuilder builder1 = new StringBuilder();<br />
string text1 = string.Empty;<br />
for (int num1 = 0; num1 &lt; this.m_requestParameters.Count; num1++)<br />
{<br />
builder1.Append(text1 + this.m_requestParameters.AllKeys[num1] + "=" + this.m_requestParameters[num1]);<br />
text1 = "&amp;";<br />
}<br />
UriBuilder builder2 = new UriBuilder(uri1);<br />
builder2.Query = builder1.ToString();<br />
uri1 = builder2.Uri;<br />
}<br />
catch (UriFormatException)<br />
{<br />
uri1 = new Uri(Path.GetFullPath(path));<br />
}<br />
return uri1;<br />
}</p>
<p>}</p>
<p>}</p>
<p>///<br />
/// 测试类<br />
///<br />
class AppTest<br />
{<br />
int _k = 0;<br />
int _K = 0;</p>
<p>static void Main()<br />
{<br />
AppTest a = new AppTest();<br />
Microshaoft.Utils.HttpWebClient x = new Microshaoft.Utils.HttpWebClient();</p>
<p>a._K = 10;</p>
<p>//订阅 DataReceive　事件<br />
x.DataReceive += new Microshaoft.Utils.HttpWebClient.DataReceiveEventHandler(a.x_DataReceive);<br />
//订阅 ExceptionOccurrs　事件<br />
x.ExceptionOccurrs += new Microshaoft.Utils.HttpWebClient.ExceptionEventHandler(a.x_ExceptionOccurrs);</p>
<p>x.ThreadProcessEnd += new Microshaoft.Utils.HttpWebClient.ThreadProcessEventHandler(a.x_ThreadProcessEnd);<br />
string F = "http://localhost/download/phpMyAdmin-2.6.1-pl2.zip";<br />
a._F = F;<br />
F = "http://localhost/download/jdk-1_5_0_01-windows-i586-p.aa.exe";</p>
<p>string f = F.Substring(F.LastIndexOf("/") + 1);</p>
<p>//(new System.Threading.Thread(new System.Threading.ThreadStart(new ThreadProcessState(F, @"E:\temp\" + f, 10, x).StartThreadProcess))).Start();</p>
<p>x.DownloadFile(F, @"E:\temp\temp\" + f, a._K);<br />
// x.DownloadFileChunk(F, @"E:\temp\" + f,15,34556);</p>
<p>System.Console.ReadLine();<br />
// string uploadfile = "e:\\test_local.rar";<br />
// string str = x.UploadFileEx("http://localhost/phpmyadmin/uploadaction.php", "POST", uploadfile, "file1");<br />
// System.Console.WriteLine(str);<br />
// System.Console.ReadLine();<br />
}</p>
<p>string bs = ""; //用于记录上次的位数<br />
bool b = false;<br />
private int i = 0;<br />
private static object _SyncLockObject = new object();<br />
string _F;<br />
string _f;</p>
<p>private void x_DataReceive(Microshaoft.Utils.HttpWebClient Sender, Microshaoft.Utils.DownLoadEventArgs e)<br />
{<br />
if (!this.b)<br />
{<br />
lock (_SyncLockObject)<br />
{<br />
if (!this.b)<br />
{<br />
System.Console.Write(System.DateTime.Now.ToString() + " 已接收数据: ");<br />
//System.Console.Write( System.DateTime.Now.ToString() + " 已接收数据: ");<br />
this.b = true;<br />
}<br />
}<br />
}<br />
string f = e.DownloadState.FileName;<br />
if (e.DownloadState.AttachmentName != null)<br />
f = System.IO.Path.GetDirectoryName(f) + @"\" + e.DownloadState.AttachmentName;</p>
<p>this._f = f;</p>
<p>using (System.IO.FileStream sw = new System.IO.FileStream(f, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite))<br />
{<br />
sw.Position = e.DownloadState.Position;<br />
sw.Write(e.DownloadState.Data, 0, e.DownloadState.Data.Length);<br />
sw.Close();<br />
}<br />
string s = System.DateTime.Now.ToString();<br />
lock (_SyncLockObject)<br />
{<br />
this.i += e.DownloadState.Data.Length;<br />
System.Console.Write(bs + "\b\b\b\b\b\b\b\b\b\b" + i + " / " + Sender.FileLength + " 字节数据 " + s);<br />
//System.Console.Write(bs + i + " 字节数据 " + s);<br />
this.bs = new string('\b', Digits(i) + 3 + Digits(Sender.FileLength) + s.Length);<br />
}<br />
}</p>
<p>int Digits(int n) //数字所占位数<br />
{<br />
n = System.Math.Abs(n);<br />
n = n / 10;<br />
int i = 1;<br />
while (n &gt; 0)<br />
{<br />
n = n / 10;<br />
i++;<br />
}<br />
return i;<br />
}</p>
<p>private void x_ExceptionOccurrs(Microshaoft.Utils.HttpWebClient Sender, Microshaoft.Utils.ExceptionEventArgs e)<br />
{<br />
System.Console.WriteLine(e.Exception.Message);<br />
//发生异常重新下载相当于断点续传,你可以自己自行选择处理方式<br />
Microshaoft.Utils.HttpWebClient x = new Microshaoft.Utils.HttpWebClient();<br />
x.DownloadFileChunk(this._F, this._f, e.DownloadState.Position, e.DownloadState.Length);<br />
e.ExceptionAction = Microshaoft.Utils.ExceptionActions.Ignore;<br />
}</p>
<p>private void x_ThreadProcessEnd(Microshaoft.Utils.HttpWebClient Sender, Microshaoft.Utils.ThreadProcessEventArgs e)<br />
{<br />
//if (e.thread.ThreadState == System.Threading.ThreadState.Stopped)<br />
if (this._k ++ == this._K - 1)<br />
System.Console.WriteLine("\nend");<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/02/16/http-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

