<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Rick &#039;s BLOG</title>
<subtitle>Rick &#039;s BLOG</subtitle>
<link href="https://www.rickw.cn/"></link>
<link href="https://www.rickw.cn/feedatom/1" rel="self" type="application/atom+xml"></link>
<updated>2026-10-23T08:22:37+08:00</updated>
<logo>https://www.rickw.cn/images/logos.gif</logo>
<author><name>rick</name>
<email>redcheek@gmail.com</email>
</author>
<id>urn:uuid:b4ac7ffb-122a-c942-88f5-ddaaaf4a756d</id>
<entry>
<title>C#实现WebApi接口数据传输加密方案</title>
<link href="https://www.rickw.cn/blogview/339"></link>
<id>urn:uuid:35e39fcc-7584-44df-6bbc-7203ba626b27</id>
<updated>2026-10-23T08:22:37+08:00</updated>
<author><name>rick</name>
</author>
<summary type="html"><![CDATA[在项目开发中我们经常会调用接口或者实现一套webapi接口；<br />
如果项目要上线到公网中，那么我们就需要考虑安全问题；<br />
即便是在内网使用，安全问题也同样不能忽视。<br />
如果没有一套安全方案，那么我们的服务很有可能会被攻击。<br />
<br />]]></summary>
<content type="html">在项目开发中我们经常会调用接口或者实现一套webapi接口；&lt;br /&gt;
如果项目要上线到公网中，那么我们就需要考虑安全问题；&lt;br /&gt;
即便是在内网使用，安全问题也同样不能忽视。&lt;br /&gt;
如果没有一套安全方案，那么我们的服务很有可能会被攻击。&lt;br /&gt;
&lt;br /&gt;
安全方案主要有加签名进行数据效验、传输数据加密等。&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;1、加签SHA256&lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;public static string GetSHA256Hash(string input)&lt;br /&gt;
{&lt;br /&gt;
	using&amp;nbsp;(SHA256 sha256Hash&amp;nbsp;= SHA256.Create())&lt;br /&gt;
	{&lt;br /&gt;
		byte[]&amp;nbsp;bytes&amp;nbsp;=&amp;nbsp;sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input));&lt;br /&gt;
		StringBuilder builder&amp;nbsp;= new StringBuilder();&lt;br /&gt;
		for (int&amp;nbsp;i&amp;nbsp;= 0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;bytes.Length;&amp;nbsp;i++)&lt;br /&gt;
		{&lt;br /&gt;
			builder.Append(bytes[i].ToString(&quot;x2&quot;));&lt;br /&gt;
		}&lt;br /&gt;
		return builder.ToString();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;2、RSA加密/解密&lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;private&amp;nbsp;readonly&amp;nbsp;RSA&amp;nbsp;_privateKeyRsaProvider;&lt;br /&gt;
private&amp;nbsp;readonly&amp;nbsp;RSA&amp;nbsp;_publicKeyRsaProvider;&lt;br /&gt;
private&amp;nbsp;readonly&amp;nbsp;Encoding&amp;nbsp;_encoding;&lt;br /&gt;
/// &amp;lt;param&amp;nbsp;name=&quot;encoding&quot;&amp;gt;编码类型&amp;lt;/param&amp;gt;&lt;br /&gt;
/// &amp;lt;param&amp;nbsp;name=&quot;privateKey&quot;&amp;gt;私钥&amp;lt;/param&amp;gt;&lt;br /&gt;
/// &amp;lt;param&amp;nbsp;name=&quot;publicKey&quot;&amp;gt;公钥&amp;lt;/param&amp;gt;&lt;br /&gt;
public&amp;nbsp;RSAHelper(Encoding&amp;nbsp;encoding,&amp;nbsp;string&amp;nbsp;privateKey,&amp;nbsp;string&amp;nbsp;publicKey&amp;nbsp;=&amp;nbsp;null)&lt;br /&gt;
{&lt;br /&gt;
	_encoding&amp;nbsp;=&amp;nbsp;encoding;&lt;br /&gt;
	if&amp;nbsp;(!string.IsNullOrEmpty(privateKey))&lt;br /&gt;
	{&lt;br /&gt;
		_privateKeyRsaProvider&amp;nbsp;=&amp;nbsp;CreateRsaProviderFromPrivateKey(privateKey);&lt;br /&gt;
	}&lt;br /&gt;
	if&amp;nbsp;(!string.IsNullOrEmpty(publicKey))&lt;br /&gt;
	{&lt;br /&gt;
		_publicKeyRsaProvider&amp;nbsp;=&amp;nbsp;CreateRsaProviderFromPublicKey(publicKey);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//解密&lt;br /&gt;
public&amp;nbsp;string&amp;nbsp;Decrypt(string&amp;nbsp;cipherText)&lt;br /&gt;
{&lt;br /&gt;
	if&amp;nbsp;(_privateKeyRsaProvider&amp;nbsp;==&amp;nbsp;null)&lt;br /&gt;
	{&lt;br /&gt;
		throw&amp;nbsp;new&amp;nbsp;Exception(&quot;_privateKeyRsaProvider&amp;nbsp;is&amp;nbsp;null&quot;);&lt;br /&gt;
	}&lt;br /&gt;
	return&amp;nbsp;Encoding.UTF8.GetString(_privateKeyRsaProvider.Decrypt(Convert.FromBase64String(cipherText),&amp;nbsp;RSAEncryptionPadding.Pkcs1));&lt;br /&gt;
}&lt;br /&gt;
//加密&lt;br /&gt;
public&amp;nbsp;string&amp;nbsp;Encrypt(string&amp;nbsp;text)&lt;br /&gt;
{&lt;br /&gt;
	if&amp;nbsp;(_publicKeyRsaProvider&amp;nbsp;==&amp;nbsp;null)&lt;br /&gt;
	{&lt;br /&gt;
		throw&amp;nbsp;new&amp;nbsp;Exception(&quot;_publicKeyRsaProvider&amp;nbsp;is&amp;nbsp;null&quot;);&lt;br /&gt;
	}&lt;br /&gt;
	return&amp;nbsp;Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text),&amp;nbsp;RSAEncryptionPadding.Pkcs1));&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;3、AES加密/解密&lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;
///&amp;nbsp;加密不带偏移量&lt;br /&gt;
/// &amp;lt;/summary&amp;gt;&lt;br /&gt;
/// &amp;lt;param&amp;nbsp;name=&quot;input&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
/// &amp;lt;param&amp;nbsp;name=&quot;key&quot;&amp;gt;秘钥&amp;lt;/param&amp;gt;&lt;br /&gt;
/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;
public&amp;nbsp;static&amp;nbsp;string&amp;nbsp;EncryptByAES(string&amp;nbsp;input,&amp;nbsp;string&amp;nbsp;key)&lt;br /&gt;
{&lt;br /&gt;
	if&amp;nbsp;(string.IsNullOrWhiteSpace(input))&lt;br /&gt;
	{&lt;br /&gt;
		return&amp;nbsp;input;&lt;br /&gt;
	}&lt;br /&gt;
	using&amp;nbsp;(RijndaelManaged&amp;nbsp;rijndaelManaged&amp;nbsp;=&amp;nbsp;new&amp;nbsp;RijndaelManaged())&lt;br /&gt;
	{&lt;br /&gt;
		rijndaelManaged.Mode&amp;nbsp;=&amp;nbsp;CipherMode.ECB;&lt;br /&gt;
		rijndaelManaged.Padding&amp;nbsp;=&amp;nbsp;PaddingMode.PKCS7;&lt;br /&gt;
		rijndaelManaged.FeedbackSize&amp;nbsp;=&amp;nbsp;128;&lt;br /&gt;
		byte[]&amp;nbsp;data3&amp;nbsp;=&amp;nbsp;Enumerable.Range(0,&amp;nbsp;key.Length&amp;nbsp;/&amp;nbsp;2).Select(x&amp;nbsp;=&amp;gt;&amp;nbsp;Byte.Parse(key.Substring(x&amp;nbsp;*&amp;nbsp;2,&amp;nbsp;2),&amp;nbsp;NumberStyles.HexNumber)).ToArray();&lt;br /&gt;
		rijndaelManaged.Key&amp;nbsp;=&amp;nbsp;data3;&lt;br /&gt;
		ICryptoTransform&amp;nbsp;encryptor&amp;nbsp;=&amp;nbsp;rijndaelManaged.CreateEncryptor(rijndaelManaged.Key,&amp;nbsp;rijndaelManaged.IV);&lt;br /&gt;
		using&amp;nbsp;(MemoryStream&amp;nbsp;msEncrypt&amp;nbsp;=&amp;nbsp;new&amp;nbsp;MemoryStream())&lt;br /&gt;
		{&lt;br /&gt;
			using&amp;nbsp;(CryptoStream&amp;nbsp;csEncrypt&amp;nbsp;=&amp;nbsp;new&amp;nbsp;CryptoStream(msEncrypt,&amp;nbsp;encryptor,&amp;nbsp;CryptoStreamMode.Write))	&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
				using&amp;nbsp;(StreamWriter&amp;nbsp;swEncrypt&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StreamWriter(csEncrypt))&lt;br /&gt;
				{&lt;br /&gt;
					swEncrypt.Write(input);&lt;br /&gt;
				}&lt;br /&gt;
				byte[]&amp;nbsp;bytes&amp;nbsp;=&amp;nbsp;msEncrypt.ToArray();&lt;br /&gt;
				//return&amp;nbsp;Convert.ToBase64String(bytes);&lt;br /&gt;
				return&amp;nbsp;HexConvert.byteToHexStr(bytes);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;
///&amp;nbsp;返回解密后的字符串&lt;br /&gt;
/// &amp;lt;/summary&amp;gt;&lt;br /&gt;
/// &amp;lt;param&amp;nbsp;name=&quot;input&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
/// &amp;lt;param&amp;nbsp;name=&quot;key&quot;&amp;gt;秘钥&amp;lt;/param&amp;gt;&lt;br /&gt;
/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;
public&amp;nbsp;static&amp;nbsp;string&amp;nbsp;DecryptByAES(string&amp;nbsp;input,&amp;nbsp;string&amp;nbsp;key)&lt;br /&gt;
{&lt;br /&gt;
	if&amp;nbsp;(string.IsNullOrWhiteSpace(input))&lt;br /&gt;
	{&lt;br /&gt;
		return&amp;nbsp;input;&lt;br /&gt;
	}&lt;br /&gt;
	//var&amp;nbsp;buffer&amp;nbsp;=&amp;nbsp;Convert.FromBase64String(input);&lt;br /&gt;
	var&amp;nbsp;buffer&amp;nbsp;=&amp;nbsp;HexConvert.strToToHexByte(input);&lt;br /&gt;
	using&amp;nbsp;(RijndaelManaged&amp;nbsp;rijndaelManaged&amp;nbsp;=&amp;nbsp;new&amp;nbsp;RijndaelManaged())&lt;br /&gt;
	{&lt;br /&gt;
		rijndaelManaged.Mode&amp;nbsp;=&amp;nbsp;CipherMode.ECB;&lt;br /&gt;
		rijndaelManaged.Padding&amp;nbsp;=&amp;nbsp;PaddingMode.PKCS7;&lt;br /&gt;
		rijndaelManaged.FeedbackSize&amp;nbsp;=&amp;nbsp;128;&lt;br /&gt;
		byte[]&amp;nbsp;data3&amp;nbsp;=&amp;nbsp;Enumerable.Range(0,&amp;nbsp;key.Length&amp;nbsp;/&amp;nbsp;2).Select(x&amp;nbsp;=&amp;gt;&amp;nbsp;Byte.Parse(key.Substring(x&amp;nbsp;*&amp;nbsp;2,&amp;nbsp;2),&amp;nbsp;NumberStyles.HexNumber)).ToArray();&lt;br /&gt;
		rijndaelManaged.Key&amp;nbsp;=&amp;nbsp;data3;&lt;br /&gt;
		ICryptoTransform&amp;nbsp;decryptor&amp;nbsp;=&amp;nbsp;rijndaelManaged.CreateDecryptor(rijndaelManaged.Key,&amp;nbsp;rijndaelManaged.IV);&lt;br /&gt;
		using&amp;nbsp;(MemoryStream&amp;nbsp;msEncrypt&amp;nbsp;=&amp;nbsp;new&amp;nbsp;MemoryStream(buffer))&lt;br /&gt;
		{&lt;br /&gt;
			using&amp;nbsp;(CryptoStream&amp;nbsp;csEncrypt&amp;nbsp;=&amp;nbsp;new&amp;nbsp;CryptoStream(msEncrypt,&amp;nbsp;decryptor,&amp;nbsp;CryptoStreamMode.Read))&lt;br /&gt;
			{&lt;br /&gt;
				using&amp;nbsp;(StreamReader&amp;nbsp;srEncrypt&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StreamReader(csEncrypt))&lt;br /&gt;
				{&lt;br /&gt;
					return&amp;nbsp;srEncrypt.ReadToEnd();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;4、数据转换&lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;//字符串转换为字节数组&lt;br /&gt;
byte[]&amp;nbsp;originalBytes&amp;nbsp;=&amp;nbsp;System.Text.Encoding.UTF8.GetBytes(originalText);&lt;br /&gt;
&lt;br /&gt;
//&amp;nbsp;进行Base64编码&lt;br /&gt;
string&amp;nbsp;base64Encoded&amp;nbsp;=&amp;nbsp;Convert.ToBase64String(originalBytes);&lt;br /&gt;
&lt;br /&gt;
//&amp;nbsp;进行Base64解码&lt;br /&gt;
byte[]&amp;nbsp;base64DecodedBytes&amp;nbsp;=&amp;nbsp;Convert.FromBase64String(base64Encoded);&lt;br /&gt;
&lt;br /&gt;
//字节数组转字符串&lt;br /&gt;
string&amp;nbsp;base64DecodedText&amp;nbsp;=&amp;nbsp;System.Text.Encoding.UTF8.GetString(base64DecodedBytes);&lt;br /&gt;
&lt;br /&gt;
//16进制转base64字符串&lt;br /&gt;
byte[]&amp;nbsp;enterpriseCode_&amp;nbsp;=&amp;nbsp;HexConvert.strToToHexByte(data.enterpriseCode);&lt;br /&gt;
string&amp;nbsp;enterpriseCode&amp;nbsp;=&amp;nbsp;Convert.ToBase64String(enterpriseCode_);&lt;br /&gt;
				&lt;br /&gt;
/// &amp;lt;summary&amp;gt; &lt;br /&gt;
///&amp;nbsp;字节数组转16进制字符串 &lt;br /&gt;
/// &amp;lt;/summary&amp;gt; &lt;br /&gt;
/// &amp;lt;param&amp;nbsp;name=&quot;byteArray&quot;&amp;gt;&amp;lt;/param&amp;gt; &lt;br /&gt;
/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt; &lt;br /&gt;
public&amp;nbsp;static&amp;nbsp;string&amp;nbsp;byteToHexStr2(byte[]&amp;nbsp;byteArray)&lt;br /&gt;
{&lt;br /&gt;
	string&amp;nbsp;hexString&amp;nbsp;=&amp;nbsp;BitConverter.ToString(byteArray);&lt;br /&gt;
	return&amp;nbsp;hexString.Replace(&quot;-&quot;,&amp;nbsp;&quot;&quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/// &amp;lt;summary&amp;gt; &lt;br /&gt;
///&amp;nbsp;字符串转16进制字节数组 &lt;br /&gt;
/// &amp;lt;/summary&amp;gt; &lt;br /&gt;
/// &amp;lt;param&amp;nbsp;name=&quot;hexString&quot;&amp;gt;&amp;lt;/param&amp;gt; &lt;br /&gt;
/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt; &lt;br /&gt;
public&amp;nbsp;static&amp;nbsp;byte[]&amp;nbsp;strToToHexByte(string&amp;nbsp;hexString)&lt;br /&gt;
{&lt;br /&gt;
	hexString&amp;nbsp;=&amp;nbsp;hexString.Replace(&quot;&amp;nbsp;&quot;,&amp;nbsp;&quot;&quot;);&lt;br /&gt;
	if&amp;nbsp;((hexString.Length&amp;nbsp;%&amp;nbsp;2)&amp;nbsp;!=&amp;nbsp;0)&lt;br /&gt;
		hexString&amp;nbsp;+=&amp;nbsp;&quot;&amp;nbsp;&quot;;&lt;br /&gt;
	byte[]&amp;nbsp;returnBytes&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[hexString.Length&amp;nbsp;/&amp;nbsp;2];&lt;br /&gt;
	for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;returnBytes.Length;&amp;nbsp;i++)&lt;br /&gt;
		returnBytes[i]&amp;nbsp;=&amp;nbsp;Convert.ToByte(hexString.Substring(i&amp;nbsp;*&amp;nbsp;2,&amp;nbsp;2),&amp;nbsp;16);&lt;br /&gt;
	return&amp;nbsp;returnBytes;&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;</content>
</entry>
<entry>
<title>C# 中实现几种幻灯片中的窗口特效</title>
<link href="https://www.rickw.cn/blogview/332"></link>
<id>urn:uuid:b78eaf60-1418-4ea1-b634-275dc71d3b33</id>
<updated>2026-10-23T08:22:37+08:00</updated>
<author><name>rick</name>
</author>
<summary type="html"><![CDATA[<ul><br />
<li>淡入淡出<br />
<li>变大变小<br />
<li>缓升缓降<br />
</ul></ol><br />]]></summary>
<content type="html">&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;淡入淡出&lt;br /&gt;
&lt;li&gt;变大变小&lt;br /&gt;
&lt;li&gt;缓升缓降&lt;br /&gt;
&lt;/ul&gt;&lt;/ol&gt;&lt;br /&gt;
&lt;br /&gt;
实现的代码片段参考如下：&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;淡入淡出&lt;/strong&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_CDryNpNs3ivA&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_CDryNpNs3ivA);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_CDryNpNs3ivA&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #007700&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Form1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;()&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InitializeComponent&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Opacity &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Interval &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Start&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
        }&lt;br /&gt;
   private &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void timer1_Tick&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;object sender&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;EventArgs e&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;isShow&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;lt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;height&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;+= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Stop&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ClientSize&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;-= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Stop&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Close&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;变大变小&lt;/strong&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_KrEkHjByqOE5&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_KrEkHjByqOE5);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_KrEkHjByqOE5&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #007700&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Form2&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;()&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InitializeComponent&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;height &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Size &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Size&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Width&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Interval &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Start&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
 private &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void timer1_Tick&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;object sender&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;EventArgs e&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;isShow&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;lt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;height&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;+= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Stop&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ClientSize&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;-= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Stop&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Close&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;缓升缓降&lt;/strong&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_lxfXMGJpdEAu&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_lxfXMGJpdEAu);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_lxfXMGJpdEAu&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #007700&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Form3&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;()&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InitializeComponent&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Interval &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
        }&lt;br /&gt;
        private &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void Form3_Load&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;object sender&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;EventArgs e&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Location &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Point&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;screenRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Width &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Width&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;screenRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Start&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
        }&lt;br /&gt;
 private &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void timer1_Tick&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;object sender&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;EventArgs e&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        {&lt;br /&gt;
            if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;isShow&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Location&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Y &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;screenRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Location &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Point&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Location&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Location&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Y &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Stop&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Location&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Y &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;lt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;screenRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Height &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Location &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Point&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Location&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Location&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Y &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;+ &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timer1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Stop&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Close&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content>
</entry>
<entry>
<title>C#中byte[]字节数组复制的5种常用方法</title>
<link href="https://www.rickw.cn/blogview/324"></link>
<id>urn:uuid:a00b3f2e-e35c-f90f-9875-4f611b10caeb</id>
<updated>2026-10-23T08:22:37+08:00</updated>
<author><name>rick</name>
</author>
<summary type="html"><![CDATA[简单总结了5种字节数组的复制方法<br />
<br />
1、for循环实现复制<br />
较为原始的遍历写法，不太推荐<br />
<br />]]></summary>
<content type="html">简单总结了5种字节数组的复制方法&lt;br /&gt;
&lt;br /&gt;
1、for循环实现复制&lt;br /&gt;
较为原始的遍历写法，不太推荐&lt;br /&gt;
&lt;br /&gt;
byte[]&amp;nbsp;data&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[]{0,1,2,3,4,5,6,7,8,9};&lt;br /&gt;
&lt;br /&gt;
byte[]&amp;nbsp;data1&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[data.length];&lt;br /&gt;
&lt;br /&gt;
for(int&amp;nbsp;i=0;i&amp;lt;data1.length;i++)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data1[i]&amp;nbsp;=&amp;nbsp;data[i];&lt;br /&gt;
}&lt;br /&gt;
2、Arrary.Copy实现复制&lt;br /&gt;
在CLR处理机制中最灵活，最强大,可装箱，拆箱复制，可加宽CLR基元类型，可内部判断实现了IFarmattable接口的兼容转换，当然这种强大方式必然会带来一定的性能损失。还有个CopyTo也是一样的。&lt;br /&gt;
&lt;br /&gt;
byte[]&amp;nbsp;data&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[]{0,1,2,3,4,5,6,7,8,9};&lt;br /&gt;
byte[]&amp;nbsp;data1&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[data.length];&lt;br /&gt;
Array.Copy(data,data1,data.length);//源数据data，目标数据data1，复制长度data.length&lt;br /&gt;
3、Clone实现复制&lt;br /&gt;
Clone会创建新数组，分配内存，不宜用在需要保持高刷新率下的场景&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;byte[]&amp;nbsp;data&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[]{0,1,2,3,4,5,6,7,8,9};&lt;br /&gt;
&amp;nbsp;byte[]&amp;nbsp;data1;&lt;br /&gt;
&amp;nbsp;data1&amp;nbsp;=&amp;nbsp;(byte[])data&amp;nbsp;.Clone()&lt;br /&gt;
4、Buffer.BlockCopy实现复制&lt;br /&gt;
则从本质上以字节为复制单位，这在底层语言C，C++的处理优势上，同理，效率之高可以理解。当然如果对性能要求不高，Copy足矣，毕竟在上千次复制下，三者基本没消耗多少时间。使用时可根据项目需求斟酌选择！&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;byte[]&amp;nbsp;srcArray&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[]&amp;nbsp;{&amp;nbsp;0x01,&amp;nbsp;0x02,&amp;nbsp;0x03,&amp;nbsp;0x04&amp;nbsp;};&lt;br /&gt;
&amp;nbsp;byte[]&amp;nbsp;dstArray&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[srcArray.Length];&lt;br /&gt;
&amp;nbsp;Buffer.BlockCopy(srcArray,&amp;nbsp;0,&amp;nbsp;dstArray,&amp;nbsp;0,&amp;nbsp;srcArray.Length);&lt;br /&gt;
&amp;nbsp;//源数据srcArray&amp;nbsp;，&amp;nbsp;起始位置0，目标数组dstArray&amp;nbsp;，开始位置0，多少长度&amp;nbsp;srcArray.Length&lt;br /&gt;
5、Array.ConstrainedCopy&amp;nbsp;实现复制&lt;br /&gt;
对复制要求严格，只能是同类型或者源数组类型是目标类型的派生元素类型，不执行装箱，拆箱，向下转换。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;byte[]&amp;nbsp;srcArray&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[]&amp;nbsp;{&amp;nbsp;0x01,&amp;nbsp;0x02,&amp;nbsp;0x03,&amp;nbsp;0x04&amp;nbsp;};&lt;br /&gt;
&amp;nbsp;byte[]&amp;nbsp;dstArray&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[srcArray.Length];&lt;br /&gt;
&amp;nbsp;Array.ConstrainedCopy(srcArray,&amp;nbsp;0,&amp;nbsp;dstArray,&amp;nbsp;0,&amp;nbsp;srcArray.Length);&lt;br /&gt;
&amp;nbsp;//源数据srcArray&amp;nbsp;，&amp;nbsp;起始位置0，目标数组dstArray&amp;nbsp;，开始位置0，多少长度&amp;nbsp;srcArray.Length</content>
</entry>
<entry>
<title>C# 使用 HttpClient错误？SocketException：现有连接被远程主机强行关闭</title>
<link href="https://www.rickw.cn/blogview/317"></link>
<id>urn:uuid:e552d6bc-129e-812c-d527-323cab18e65d</id>
<updated>2026-10-23T08:22:37+08:00</updated>
<author><name>rick</name>
</author>
<summary type="html"><![CDATA[C#中使用&nbsp;HttpClient&nbsp;访问https站点，出现以下错误。<br />
<br />
System.AggregateException<br />
&nbsp;&nbsp;HResult&nbsp;=&nbsp;0x80131500<br />
&nbsp;&nbsp;Message&nbsp;=发生一个或多个错误。<br />]]></summary>
<content type="html">C#中使用&amp;nbsp;HttpClient&amp;nbsp;访问https站点，出现以下错误。&lt;br /&gt;
&lt;br /&gt;
System.AggregateException&lt;br /&gt;
&amp;nbsp;&amp;nbsp;HResult&amp;nbsp;=&amp;nbsp;0x80131500&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Message&amp;nbsp;=发生一个或多个错误。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;来源=&amp;nbsp;System.Private.CoreLib&lt;br /&gt;
&amp;nbsp;&amp;nbsp;堆栈跟踪：&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;在System.Threading.Tasks.Task`1.GetResultCore（Boolean&amp;nbsp;waitCompletionNotification）&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;br /&gt;
内部例外1：&lt;br /&gt;
HttpRequestException：无法建立SSL连接，请参阅内部异常。&lt;br /&gt;
&lt;br /&gt;
内部例外2：&lt;br /&gt;
IOException：无法从传输连接中读取数据：现有连接被远程主机强行关闭。&lt;br /&gt;
&lt;br /&gt;
内部例外3：&lt;br /&gt;
SocketException：现有连接被远程主机强行关闭&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_aq7yVf4JSHOd&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_aq7yVf4JSHOd);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_aq7yVf4JSHOd&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;class &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Program&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
    static &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void Main&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[] &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
    {&lt;br /&gt;
        var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;url &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;https://google.com&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
        var (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;statusCode&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;) = &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;requestString&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;WriteLine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;%d %s&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;statusCode&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    static &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;CookieContainer cc &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;CookieContainer&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
&lt;br /&gt;
    static &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HttpClientHandler handler &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HttpClientHandler &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AllowAutoRedirect &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;CookieContainer &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;cc &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;};&lt;br /&gt;
&lt;br /&gt;
    public static &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;async Task&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;lt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;int statusCode&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;string content&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;requestStringAsync&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;string url&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ServicePointManager&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ServerCertificateValidationCallback &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;+= (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;sender&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;cert&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;chain&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;sslPolicyErrors&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;) =&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ServicePointManager&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SecurityProtocol &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;|= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SecurityProtocolType&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Tls &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;| &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SecurityProtocolType&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Tls11 &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;| &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SecurityProtocolType&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Tls12&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                                                                     &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// | SecurityProtocolType.Ssl3;&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;request &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HttpRequestMessage &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RequestUri &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Uri&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Method &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HttpMethod&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Get &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;})&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;client &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HttpClient&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;handler&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;))&lt;br /&gt;
        {&lt;br /&gt;
            var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;response &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;await client&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SendAsync&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Error (actual line)&lt;br /&gt;
         &lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;statusCode &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= (int)&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;StatusCode&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;content &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;await response&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Content&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ReadAsStringAsync&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
            return (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;statusCode&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;int statusCode&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;string content&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;requestString&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;string url&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
    {&lt;br /&gt;
        return &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;requestStringAsync&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Result&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
    }&lt;br /&gt;
} &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
按上面调整&amp;nbsp;ServicePointManager&amp;nbsp;后在&amp;nbsp;.net&amp;nbsp;framework环境中就可以正常运行了。&lt;br /&gt;
&lt;br /&gt;
在.Net&amp;nbsp;Core的环境中还可能发生问题。&lt;br /&gt;
&lt;br /&gt;
.Net&amp;nbsp;Core中可以使用以下机制之一来配置进程以使用较旧的HttpClientHandler：&lt;br /&gt;
&lt;br /&gt;
从代码中，使用AppContext类：&lt;br /&gt;
&lt;br /&gt;
AppContext.SetSwitch(&quot;System.Net.Http.UseSocketsHttpHandler&quot;,&amp;nbsp;false);&lt;br /&gt;
&lt;br /&gt;
也可以通过配置文件来设置AppContext开关。&lt;br /&gt;
&lt;br /&gt;
可以通过环境变量DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER实现相同的目的。&lt;br /&gt;
要选择退出，请将值设置为false或0。</content>
</entry>
<entry>
<title>C#屏幕截图，指定区域截图，窗口截图的实现</title>
<link href="https://www.rickw.cn/blogview/316"></link>
<id>urn:uuid:32aeecf1-7ab7-cf21-60e7-472d51ef05a9</id>
<updated>2026-10-23T08:22:37+08:00</updated>
<author><name>rick</name>
</author>
<summary type="html"><![CDATA[核心方法是使用Graphics类的CopyFromScreen方法将窗口的内容复制到位图中。<br />
指定区域截图，只需要将屏幕图片按区域裁剪即可。<br />
指定窗口截图，先获取窗口的位置和大小，然后转化为指定区域截图了。<br />
如果是制作指定窗口的录屏程序时，需要注意实时跟踪窗口的位置和大小（窗口位置和大小可能会调整变化）。<br />
其它的就没有特别的了。<br />]]></summary>
<content type="html">核心方法是使用Graphics类的CopyFromScreen方法将窗口的内容复制到位图中。&lt;br /&gt;
指定区域截图，只需要将屏幕图片按区域裁剪即可。&lt;br /&gt;
指定窗口截图，先获取窗口的位置和大小，然后转化为指定区域截图了。&lt;br /&gt;
如果是制作指定窗口的录屏程序时，需要注意实时跟踪窗口的位置和大小（窗口位置和大小可能会调整变化）。&lt;br /&gt;
其它的就没有特别的了。&lt;br /&gt;
&lt;br /&gt;
例子代码：&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_SrsIef3B9Trk&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_SrsIef3B9Trk);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_SrsIef3B9Trk&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using System&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using System&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Drawing&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using System&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Runtime&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InteropServices&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
class &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Program&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
    [&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;DllImport&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;user32.dll&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)]&lt;br /&gt;
    static &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;extern IntPtr GetForegroundWindow&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
&lt;br /&gt;
    [&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;DllImport&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;user32.dll&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)]&lt;br /&gt;
    [return: &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;MarshalAs&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;UnmanagedType&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Bool&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)]&lt;br /&gt;
    static &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;extern bool GetWindowRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IntPtr hWnd&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;out RECT lpRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
&lt;br /&gt;
    [&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;StructLayout&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;LayoutKind&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Sequential&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)]&lt;br /&gt;
    public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;struct RECT&lt;br /&gt;
    &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
        public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;int Left&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
        public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;int Top&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
        public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;int Right&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
        public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;int Bottom&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    static &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void Main&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;()&lt;br /&gt;
    {&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// 获取活动窗口句柄&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IntPtr hWnd &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;GetForegroundWindow&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// 获取窗口位置和大小&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RECT windowRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;GetWindowRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;hWnd&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;out windowRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// 创建Bitmap对象&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Bitmap bmp &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Bitmap&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;windowRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Right &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;windowRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Left&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;windowRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Bottom &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;windowRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Top&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;))&lt;br /&gt;
            {&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// 创建Graphics对象&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Graphics g &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Graphics&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;FromImage&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bmp&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;))&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// 将窗口内容绘制到Bitmap中&lt;br /&gt;
                    // 这里可以直接指定位置和大小进行图片截取拷贝&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;CopyFromScreen&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Point&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;windowRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Left&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;windowRect&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Top&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Point&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.Empty, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bmp&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Size&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// 保存屏幕截图（可根据需要进行保存）&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bmp&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Save&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;screenshot.png&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
                &lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;WriteLine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;屏幕截图已保存成功。&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        catch (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Exception ex&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;WriteLine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;发生异常：&quot; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;+ &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ex&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Message&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
} &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content>
</entry>
<entry>
<title>C#同步代码中调用async异步方法.Result等待导致阻塞死锁deadlock的问题</title>
<link href="https://www.rickw.cn/blogview/310"></link>
<id>urn:uuid:1a27481a-333a-e6ac-239f-7c2a051f016a</id>
<updated>2026-10-23T08:22:37+08:00</updated>
<author><name>rick</name>
</author>
<summary type="html"><![CDATA[在&nbsp;UI界面或者ASP.NET的同步代码中调用async的异步代码时如果async和task.Result混用会出现线程被阻塞锁死deadlock的情况。<br />
<strong>导致死锁的例子代码：</strong><br />
<div class="txt_main">public&nbsp;static&nbsp;async&nbsp;Task&lt;string&gt;&nbsp;GetWebPageAsync(string&nbsp;uri)<br />
{<br />
&nbsp;&nbsp;//这里的&nbsp;client&nbsp;是全局初始化的&nbsp;HttpClient&nbsp;对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;=&nbsp;await&nbsp;client.GetStringAsync(uri);<br />
}<br />
<br />
public&nbsp;void&nbsp;Button1_Click(object&nbsp;sender,&nbsp;EventArg&nbsp;e)<br />
{<br />
&nbsp;&nbsp;var&nbsp;webTask&nbsp;=&nbsp;GetWebPageAsync("_get_url_");<br />
&nbsp;&nbsp;textBox1.Text&nbsp;=&nbsp;webTask.Result;<br />
}</div><br />
]]></summary>
<content type="html">在&amp;nbsp;UI界面或者ASP.NET的同步代码中调用async的异步代码时如果async和task.Result混用会出现线程被阻塞锁死deadlock的情况。&lt;br /&gt;
&lt;strong&gt;导致死锁的例子代码：&lt;/strong&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;public&amp;nbsp;static&amp;nbsp;async&amp;nbsp;Task&amp;lt;string&amp;gt;&amp;nbsp;GetWebPageAsync(string&amp;nbsp;uri)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;//这里的&amp;nbsp;client&amp;nbsp;是全局初始化的&amp;nbsp;HttpClient&amp;nbsp;对象&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;nbsp;=&amp;nbsp;await&amp;nbsp;client.GetStringAsync(uri);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public&amp;nbsp;void&amp;nbsp;Button1_Click(object&amp;nbsp;sender,&amp;nbsp;EventArg&amp;nbsp;e)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;var&amp;nbsp;webTask&amp;nbsp;=&amp;nbsp;GetWebPageAsync(&quot;_get_url_&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;textBox1.Text&amp;nbsp;=&amp;nbsp;webTask.Result;&lt;br /&gt;
}&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;阻止死锁的两种办法：&lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;&lt;strong&gt;一、使用&amp;nbsp;ConfigureAwait(false)&lt;/strong&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;public&amp;nbsp;static&amp;nbsp;async&amp;nbsp;Task&amp;lt;string&amp;gt;&amp;nbsp;GetWebPageAsync(string&amp;nbsp;uri)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;//这里的&amp;nbsp;client&amp;nbsp;是全局初始化的&amp;nbsp;HttpClient&amp;nbsp;对象&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;nbsp;=&amp;nbsp;await&amp;nbsp;client.GetStringAsync(uri)&lt;font color=&quot;red&quot;&gt;.ConfigureAwait(false)&lt;/font&gt;;&lt;br /&gt;
}&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code_head&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code_main quote&quot;&gt;&lt;blockquote&gt;默认情况下，当您使用async/await时，它将在开始请求的原始线程上继续运行(状态机)。但是，如果当前另一个长时间运行的进程已经接管了该线程，那么你就不得不等待它完成。要避免这个问题，可以使用ConfigureAwait的方法和false参数。当你用这个方法的时候，这将告诉Task它可以在任何可用的线程上恢复自己继续运行，而不是等待最初创建它的线程。这将加快响应速度并避免许多死锁。&lt;br /&gt;
&lt;br /&gt;
但是，当使用此方法后，线程同步上下文将丢失，从而转变成异步操作，如果在之后继续操作界面元素等，会提示线程不安全。&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;二、使用&amp;nbsp;异步Async&amp;nbsp;方法进行调用：&lt;/strong&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;public&amp;nbsp;&lt;font color=&quot;red&quot;&gt;async&lt;/font&gt;&amp;nbsp;void&amp;nbsp;Button1_Click(object&amp;nbsp;sender,&amp;nbsp;EventArg&amp;nbsp;e)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;var&amp;nbsp;webTask&amp;nbsp;=&amp;nbsp;GetWebPageAsync(&quot;_get_url_&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;textBox1.Text&amp;nbsp;=&amp;nbsp;webTask.Result;&lt;br /&gt;
}&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;</content>
</entry>
<entry>
<title>解决C#编译问题 CS 1617：/langversion的选项“10”无效</title>
<link href="https://www.rickw.cn/blogview/300"></link>
<id>urn:uuid:01857c55-2cdd-141e-7eb6-2081cc90d33e</id>
<updated>2026-10-23T08:22:37+08:00</updated>
<author><name>rick</name>
</author>
<summary type="html"><![CDATA[这个选项是开启C#10的语言特性支持。<br />
和VS版本有关，如果你使用的是VS2019，那么关闭项目，用文本打开csproj文件，将&lt;LangVersion&gt;10.0&lt;/LangVersion&gt;改为&lt;LangVersion&gt;9.0&lt;/LangVersion&gt;<br />
<br />
或者升级使用VS&nbsp;2022打开项目进行编译。<br />
]]></summary>
<content type="html">这个选项是开启C#10的语言特性支持。&lt;br /&gt;
和VS版本有关，如果你使用的是VS2019，那么关闭项目，用文本打开csproj文件，将&amp;lt;LangVersion&amp;gt;10.0&amp;lt;/LangVersion&amp;gt;改为&amp;lt;LangVersion&amp;gt;9.0&amp;lt;/LangVersion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
或者升级使用VS&amp;nbsp;2022打开项目进行编译。&lt;br /&gt;
</content>
</entry>
<entry>
<title>Jurassic [C# .Net JavaScript引擎]限制脚本执行时间，防止死循环</title>
<link href="https://www.rickw.cn/blogview/283"></link>
<id>urn:uuid:c9a43c3e-6c92-28c1-2d25-a5325275b1f9</id>
<updated>2026-10-23T08:22:37+08:00</updated>
<author><name>rick</name>
</author>
<summary type="html"><![CDATA[想象一下在js引擎中执行如下代码：<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_TwCtyPCk83xr')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_TwCtyPCk83xr);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_TwCtyPCk83xr" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><pre><code style="color: #000000"><span style="color: #007700">try {}<br />
finally {<br />
    while (</span><span style="color: #0000BB">true</span><span style="color: #007700">);} </span><span style="color: #0000BB">?&gt;</span></code></pre></div><br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_il2LrVc4uqz2')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_il2LrVc4uqz2);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_il2LrVc4uqz2" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><pre><code style="color: #000000"><span style="color: #0000BB"> </span><span style="color: #007700">while (</span><span style="color: #0000BB">true</span><span style="color: #007700">);  </span><span style="color: #0000BB">?&gt;</span></code></pre></div><br />
这样一个无限循环的js代码在&nbsp;ScriptEngine.Execute(String&nbsp;code)的调用中将永远不会返回。<br />
]]></summary>
<content type="html">想象一下在js引擎中执行如下代码：&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_N6D5CGrbd6P4&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_N6D5CGrbd6P4);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_N6D5CGrbd6P4&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #007700&quot;&gt;try {}&lt;br /&gt;
finally {&lt;br /&gt;
    while (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);} &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_ZQBGWVCBkrwo&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_ZQBGWVCBkrwo);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_ZQBGWVCBkrwo&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;while (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);  &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
这样一个无限循环的js代码在&amp;nbsp;ScriptEngine.Execute(String&amp;nbsp;code)的调用中将永远不会返回。&lt;br /&gt;
&lt;br /&gt;
Jurassic没有本身没有实现限制脚本执行时间的功能。由于Jurassic将JavaScript方法编译为IL代码，没有简单的方式来实现超时功能而不影响性能。但是，我们可以在执行脚本的线程中调用Thread.Abort()引发ThreadAbortException来终止脚本的执行。&lt;br /&gt;
&lt;h2&gt;一种实现方式：&lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;在新线程中执行&amp;nbsp;ScriptEngine.Execute()，在当前线程中进行等待并计时。当新线程在规定的时间内未完成，则在当前线程中调用&lt;br /&gt;
thread.Abort()来终止新线程，并抛出一个超时的异常(TimeOutException)。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;用于限制脚本执行时间的Helper类（ScriptTimeoutHelper）&lt;/h2&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_C7wm5YTIB1ck&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_C7wm5YTIB1ck);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_C7wm5YTIB1ck&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using System&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using System&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Runtime&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ExceptionServices&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using System&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Threading&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using System&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Threading&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Tasks&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
namespace &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;JurassicTimeoutHelper&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
    &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Allows to limit execution time of a Jurassic Script by internally using the&lt;br /&gt;
    /// technique of aborting a thread.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;public class &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ScriptTimeoutHelper&lt;br /&gt;
    &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
        private &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerState currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
        public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ScriptTimeoutHelper&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;()&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Runs the specified &amp;lt;see cref=&quot;Action&quot;/&amp;gt; in the current thread,&lt;br /&gt;
        /// applying the given timeout.&lt;br /&gt;
        /// When the handler times out, a &amp;lt;see cref=&quot;ThreadAbortException&quot;/&amp;gt; is&lt;br /&gt;
        /// raised in the current thread to break. However, this is managed&lt;br /&gt;
        /// internally so it does not affect the caller of this method (i.e. it is&lt;br /&gt;
        /// ensured that a &amp;lt;see cref=&quot;ThreadAbortException&quot;/&amp;gt; does not flow through&lt;br /&gt;
        /// this method or raised after this method returns).&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;exception cref=&quot;TimeoutException&quot;&amp;gt;Thrown when the handler times &lt;br /&gt;
        /// out.&amp;lt;/exception&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&quot;handler&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&quot;timeout&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void RunWithTimeout&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Action handler&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;int timeout&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        {&lt;br /&gt;
            if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;!= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                throw new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;br /&gt;
                    $&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;Cannot recursively call {nameof(RunWithTimeout)}.&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
            if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;handler &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;== &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                throw new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ArgumentException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;nameof&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;handler&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;));&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Throw the TimeoutException immediately when the timeout is 0.&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timeout &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;== &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                throw new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;TimeoutException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ExceptionDispatchInfo caughtException &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&lt;br /&gt;
                new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Thread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;CurrentThread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;))&lt;br /&gt;
            {&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/* Start a monitoring task that may abort the current thread after&lt;br /&gt;
                 * the specified time limit.&lt;br /&gt;
                 * Note that the task will start immediately. Therefore we need to&lt;br /&gt;
                 * ensure the task does not abort the thread until we entered the&lt;br /&gt;
                 * try clause; otherwise the ThreadAbortException might fly through&lt;br /&gt;
                 * the caller of this method. To ensure this, the monitoring task&lt;br /&gt;
                 * waits until we release the semaphore the first time before&lt;br /&gt;
                 * actually waiting for the specified time.&lt;br /&gt;
                */&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;monitoringTask &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Task&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Run&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;async &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;() =&amp;gt;&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;await RunMonitoringTask&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timeout&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)))&lt;br /&gt;
                {&lt;br /&gt;
                    try&lt;br /&gt;
                    {&lt;br /&gt;
                        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bool waitForAbortException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                        try&lt;br /&gt;
                        {&lt;br /&gt;
                            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Allow the monitoring task to begin by releasing the&lt;br /&gt;
                            // semaphore the first time.&lt;br /&gt;
                            // Do this in a finally block to ensure if this thread&lt;br /&gt;
                            // is aborted by other code, the semaphore is still&lt;br /&gt;
                            // released.&lt;br /&gt;
                            &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;try { }&lt;br /&gt;
                            finally&lt;br /&gt;
                            {&lt;br /&gt;
                                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;WaitSemaphore&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Release&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                            }&lt;br /&gt;
&lt;br /&gt;
                            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Execute the handler.&lt;br /&gt;
                            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;handler&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                        }&lt;br /&gt;
                        catch (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Exception ex&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;when &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(!(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ex is ThreadAbortException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;))&lt;br /&gt;
                        {&lt;br /&gt;
                            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/* Need to catch all exceptions (except our own&lt;br /&gt;
                             * ThreadAbortException) because we may wait for a&lt;br /&gt;
                             * ThreadAbortException to be thrown which is not&lt;br /&gt;
                             * possible in a finally handler.&lt;br /&gt;
                             */&lt;br /&gt;
                            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;caughtException &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ExceptionDispatchInfo&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Capture&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ex&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
                        }&lt;br /&gt;
                        finally&lt;br /&gt;
                        {&lt;br /&gt;
                            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/* Indicate that the handler is completed, and check&lt;br /&gt;
                             * if we need to wait for the ThreadAbortException.&lt;br /&gt;
                             * This is done in a finally handler to ensure when&lt;br /&gt;
                             * other code wants to abort this thread, the thread&lt;br /&gt;
                             * actually will abort as expected but we still can&lt;br /&gt;
                             * notify the monitoring task that we already returned.&lt;br /&gt;
                             */&lt;br /&gt;
                            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;lock &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                            {&lt;br /&gt;
                                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsExited &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;waitForAbortException &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&lt;br /&gt;
                                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;== &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsAborting&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
                                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;== &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                                {&lt;br /&gt;
                                    &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// If the monitoring task did not do anything&lt;br /&gt;
                                    // yet, allow it to complete immediately.&lt;br /&gt;
                                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;WaitSemaphore&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Release&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;waitForAbortException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                        {&lt;br /&gt;
                            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/* The monitoring task indicated that it will abort our&lt;br /&gt;
                             * thread (but the ThreadAbortException did not yet&lt;br /&gt;
                             * occur), so we need to wait for the&lt;br /&gt;
                             * ThreadAbortException.&lt;br /&gt;
                             * This wait is needed because otherwise we may return&lt;br /&gt;
                             * too early (and in the finally block we wait for the&lt;br /&gt;
                             * monitoring task, causing a deadlock).&lt;br /&gt;
                             */&lt;br /&gt;
                            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Thread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Sleep&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Timeout&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Infinite&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    catch (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ThreadAbortException ex&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;when &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ex&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ExceptionState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;== &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                    {&lt;br /&gt;
                        &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Reset the abort.&lt;br /&gt;
                        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Thread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ResetAbort&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
&lt;br /&gt;
                        &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Indicate that the timeout has been exceeded.&lt;br /&gt;
                        &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;throw new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;TimeoutException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                    }&lt;br /&gt;
                    finally&lt;br /&gt;
                    {&lt;br /&gt;
                        &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Wait for the monitoring task to complete.&lt;br /&gt;
                        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;monitoringTask&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Wait&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Check if we need to rethrow a caught exception (preserving the&lt;br /&gt;
            // original stacktrace).&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;caughtException &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;!= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;caughtException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.Throw();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;async Task RunMonitoringTask&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerState state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;int timeout&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Wait until the handler thread entered the try-block.&lt;br /&gt;
            // Use a synchronous wait because we expect this to be a very short&lt;br /&gt;
            // period of time.&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;WaitSemaphore&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Wait&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Now asynchronously wait until the specified time has passed or the&lt;br /&gt;
            // semaphore has been released. In the latter case there is no need to&lt;br /&gt;
            // call AbortExecution().&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bool completed &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;await state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;WaitSemaphore&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;WaitAsync&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timeout&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Abort the handler thread.&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;if (!&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;completed&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortExecution&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void AbortExecution&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerState state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bool canAbort&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;lock &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsExited&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// The handler has already exited.&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;return;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// Check if we can call Thread.Abort() or if the handler thread is&lt;br /&gt;
                // currently in a critical section and needs to abort himself when&lt;br /&gt;
                // leaving the critical section.&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;canAbort &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= !&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsCriticalSection&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;canAbort &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;? &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsAborting&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ShouldAbort&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            }&lt;br /&gt;
            if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;canAbort&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/* The handler thread is not in a critical section so we can&lt;br /&gt;
                 * directly abort it.&lt;br /&gt;
                 * This needs to be done outside of the lock because Abort() could&lt;br /&gt;
                 * block if the  thread is currently in a finally handler (and&lt;br /&gt;
                 * trying to lock on the state object), which could lead to a&lt;br /&gt;
                 * deadlock.&lt;br /&gt;
                 */&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerThread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Abort&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Notifies this class that the handler thread is entering a critical&lt;br /&gt;
        /// section in which aborting the thread could corrupt the system&#039;s state.&lt;br /&gt;
        /// This means aborting the thread will be deferred until leaving the&lt;br /&gt;
        /// critical section.&lt;br /&gt;
        /// Note that you must call &amp;lt;see cref=&quot;ExitCriticalSection&quot;/&amp;gt; in a&lt;br /&gt;
        /// &amp;lt;c&amp;gt;finally&amp;lt;/c&amp;gt; block once the thread left the critical section.&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void EnterCriticalSection&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;()&lt;br /&gt;
        {&lt;br /&gt;
            if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;== &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                throw new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bool waitForAbortException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;lock &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Thread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;CurrentThread &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;!= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerThread&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;|| &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsCriticalSection&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                    throw new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsCriticalSection &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;waitForAbortException &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;== &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsAborting&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            }&lt;br /&gt;
            if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;waitForAbortException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// The monitoring task indicated that it will abort our thread, so&lt;br /&gt;
                // we need to wait for the ThreadAbortException.&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Thread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Sleep&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Timeout&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Infinite&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void ExitCriticalSection&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;()&lt;br /&gt;
        {&lt;br /&gt;
            if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;== &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                throw new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bool shouldAbort&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;lock &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Thread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;CurrentThread &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;!= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerThread&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;|| !&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsCriticalSection&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                    throw new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsCriticalSection &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;shouldAbort &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;== &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ShouldAbort&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            }&lt;br /&gt;
            if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;shouldAbort&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// The monitoring task indicated that it wanted to abort our&lt;br /&gt;
                // thread while we were in a critical section, so we need to abort&lt;br /&gt;
                // ourselves.&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Thread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;CurrentThread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Abort&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;currentState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private enum &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;
            /// Indicates that the monitoring task has not yet done any action.&lt;br /&gt;
            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;None &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;
            /// Indicates that the monitoring task is about to abort the handler&lt;br /&gt;
            /// thread.&lt;br /&gt;
            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IsAborting &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;
            /// Indicates that the monitoring task wanted to abort the handler&lt;br /&gt;
            /// thread but the handler thread was in a critical section, and needs&lt;br /&gt;
            /// to abort itself when leaving the critical section.&lt;br /&gt;
            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ShouldAbort &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;2&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;}&lt;br /&gt;
&lt;br /&gt;
        private class &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;IDisposable&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
&lt;br /&gt;
            public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Thread HandlerThread &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;; }&lt;br /&gt;
&lt;br /&gt;
            public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SemaphoreSlim WaitSemaphore &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;; } = new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SemaphoreSlim&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
&lt;br /&gt;
            public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bool IsCriticalSection &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;; }&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;
            /// Indicates if the handler is already completed (so there&#039;s no need&lt;br /&gt;
            /// to abort the thread).&lt;br /&gt;
            /// This flag is set by the handler thread.&lt;br /&gt;
            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bool IsExited &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;; }&lt;br /&gt;
&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;
            /// Indicates that the wait task wanted to abort the handler thread but&lt;br /&gt;
            /// the handler thread was in a critical section, and needs to abort&lt;br /&gt;
            /// itself when leaving the critical section.&lt;br /&gt;
            /// This flag is set by the wait task.&lt;br /&gt;
            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
            &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AbortState AbortState &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Thread handlerThread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerThread &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;handlerThread&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            ~&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;HandlerState&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;()&lt;br /&gt;
            {&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Dispose&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void Dispose&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;()&lt;br /&gt;
            {&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Dispose&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
                &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;GC&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SuppressFinalize&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            protected &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;void Dispose&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bool disposing&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
            {&lt;br /&gt;
                if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;disposing&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
                {&lt;br /&gt;
                    &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;WaitSemaphore&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Dispose&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
} &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
原来执行javascpript的方式如下：&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_Zpi8MAGf8z5J&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_Zpi8MAGf8z5J);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_Zpi8MAGf8z5J&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #007700&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ScriptEngine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;compiledScript &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Compile&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;StringScriptSource&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;br /&gt;
    &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;while (true) ;&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;));&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;compiledScript&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Execute&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;改进后新的执行javascpript的方式如下：&lt;/h2&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_Xb16fCiVaNCZ&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_Xb16fCiVaNCZ);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_Xb16fCiVaNCZ&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #007700&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timeoutHelper &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ScriptTimeoutHelper&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ScriptEngine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
var &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;compiledScript &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Compile&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;StringScriptSource&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;br /&gt;
    &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;while (true) ;&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;));&lt;br /&gt;
try{&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;timeoutHelper&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RunWithTimeout&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(() =&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;compiledScript&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Execute&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
}&lt;br /&gt;
catch(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;TimeoutException ex&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;){&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;//这里表示执行超时&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;}&lt;br /&gt;
 &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;注意事项：&lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;我们使用useScriptEngine.Compile()首先编译脚本，然后将超时仅应用于实际执行脚本。&lt;br /&gt;
上面的调用代码设置的超时时间是1秒，如果JavaScript未在1秒钟内完成，我们将捕获到TimeoutException异常。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;注：在发生TimeoutException以后，我们不应该继续使用ScriptEngine及其关联的对象实例，因为它们可能处于不一致/不可用状态。而是创建一个新的ScriptEngine实例以运行更多脚本文件。&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content>
</entry>
<entry>
<title>介绍一个C#的javascpript引擎 Jurassic</title>
<link href="https://www.rickw.cn/blogview/279"></link>
<id>urn:uuid:0df89e22-5098-71f3-8eaa-a9a981f927d1</id>
<updated>2026-10-23T08:22:37+08:00</updated>
<author><name>rick</name>
</author>
<summary type="html"><![CDATA[这是一个纯.Net实现的javascpript引擎，目前支持ECMAScript&nbsp;3&nbsp;和&nbsp;ECMAScript&nbsp;5&nbsp;包括&nbsp;ES5&nbsp;strict&nbsp;模式。<br />
ECMAScript&nbsp;6的支持还在开发中，已经支持了es6的大部分特性。<br />
<br />
性能好：它将JavaScript编译为.NET字节码（CIL），而非解释执行。这样使得它的运行性能更好；<br />
<br />]]></summary>
<content type="html">这是一个纯.Net实现的javascpript引擎，目前支持ECMAScript&amp;nbsp;3&amp;nbsp;和&amp;nbsp;ECMAScript&amp;nbsp;5&amp;nbsp;包括&amp;nbsp;ES5&amp;nbsp;strict&amp;nbsp;模式。&lt;br /&gt;
ECMAScript&amp;nbsp;6的支持还在开发中，已经支持了es6的大部分特性。&lt;br /&gt;
&lt;br /&gt;
性能好：它将JavaScript编译为.NET字节码（CIL），而非解释执行。这样使得它的运行性能更好；&lt;br /&gt;
&lt;br /&gt;
纯.Net开发：纯.Net开发，不依赖任何第三方库，只有单个dll文件，可以完全集成到.Net框架中，可以在任何支持.Net平台执行；&lt;br /&gt;
&lt;br /&gt;
使用：&lt;br /&gt;
1，可以直接用&amp;nbsp;NuGet&amp;nbsp;获取&amp;nbsp;Jurassic。&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;using&amp;nbsp;Jurassic;&lt;/div&gt;&lt;br /&gt;
简单的执行js字符串&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;var&amp;nbsp;engine&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Jurassic.ScriptEngine();&lt;br /&gt;
&amp;nbsp;engine.Evaluate(&quot;function&amp;nbsp;main(a,b){return&amp;nbsp;a+b;}&quot;);&lt;br /&gt;
var&amp;nbsp;addResult=&amp;nbsp;engine.CallGlobalFunction(&quot;main&quot;,&amp;nbsp;5,&amp;nbsp;6);//结果11&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
2，.Net&amp;nbsp;和&amp;nbsp;javascpript&amp;nbsp;之间交互。&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;&lt;strong&gt;暴露net的class给js&lt;/strong&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_y8sYTK1bsgsn&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_y8sYTK1bsgsn);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_y8sYTK1bsgsn&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&lt;br /&gt;
using Jurassic&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using Jurassic&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Library&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
public class &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AppInfo &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ObjectInstance&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
    public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AppInfo&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ScriptEngine engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        : &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;base&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// 重写name属性&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;] = &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;Test Application&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// 只读属性&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;DefineProperty&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;PropertyDescriptor&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;PropertyAttributes&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Sealed&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SetGlobalValue&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;appInfo&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;AppInfo&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;));&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;WriteLine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Evaluate&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;appInfo.name + &#039; &#039; + appInfo.version&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)); &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;暴露net的class的静态方法&lt;/strong&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_Ks2A4PGh9dmo&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_Ks2A4PGh9dmo);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_Ks2A4PGh9dmo&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&lt;br /&gt;
using Jurassic&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using Jurassic&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Library&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
public class &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Math2 &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ObjectInstance&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
    public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Math2&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ScriptEngine engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        : &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;base&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;PopulateFunctions&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    [&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;JSFunction&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Name &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;log10&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)]&lt;br /&gt;
    public static &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;double Log10&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;double num&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
    {&lt;br /&gt;
        return &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Math&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Log10&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SetGlobalValue&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;math2&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Math2&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;));&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Evaluate&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;double&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;math2.log10(1000)&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;暴露net的类实例&lt;/strong&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_kHG8Z1jeeYse&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_kHG8Z1jeeYse);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_kHG8Z1jeeYse&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&lt;br /&gt;
using Jurassic&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using Jurassic&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Library&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
public class &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RandomConstructor &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ClrFunction&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
    public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RandomConstructor&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ScriptEngine engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        : &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;base&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.Function.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InstancePrototype&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;Random&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RandomInstance&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InstancePrototype&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;))&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    [&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;JSConstructorFunction&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;]&lt;br /&gt;
    public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RandomInstance Construct&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;int seed&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
    {&lt;br /&gt;
        return new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RandomInstance&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;InstancePrototype&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;seed&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RandomInstance &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ObjectInstance&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;{&lt;br /&gt;
    private &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Random random&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
    public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RandomInstance&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ObjectInstance prototype&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        : &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;base&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;prototype&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;PopulateFunctions&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;random &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Random&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RandomInstance&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;ObjectInstance prototype&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;int seed&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
        : &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;base&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;prototype&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;random &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Random&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;seed&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    [&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;JSFunction&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Name &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;nextDouble&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;)]&lt;br /&gt;
    public &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;double NextDouble&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;()&lt;br /&gt;
    {&lt;br /&gt;
        return &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;random&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;NextDouble&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;SetGlobalValue&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;Random&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, new &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;RandomConstructor&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;));&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;engine&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Evaluate&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;double&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;var rand = new Random(1000); rand.nextDouble()&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;</content>
</entry>
<entry>
<title>C#等效于php的password_verify 和 password_hash 功能的函数实现</title>
<link href="https://www.rickw.cn/blogview/277"></link>
<id>urn:uuid:de364a56-6d8e-7a21-6faf-b4828602a189</id>
<updated>2026-10-23T08:22:37+08:00</updated>
<author><name>rick</name>
</author>
<summary type="html"><![CDATA[<div class="txt_main">C#中能够等价于&nbsp;php&nbsp;password_verify&nbsp;和&nbsp;password_hash&nbsp;功能的实现方法。<br />
有时候可能会需要在C#程序中来验证&nbsp;php&nbsp;生成的哈希密码。实现php系统和C#系统的密码互通。<br />
例如：将php系统迁移到&nbsp;.NetCore的系统。<br />
或者混合使用php系统和.NetCore系统。</div><br />
<br />]]></summary>
<content type="html">&lt;div class=&quot;txt_main&quot;&gt;C#中能够等价于&amp;nbsp;php&amp;nbsp;password_verify&amp;nbsp;和&amp;nbsp;password_hash&amp;nbsp;功能的实现方法。&lt;br /&gt;
有时候可能会需要在C#程序中来验证&amp;nbsp;php&amp;nbsp;生成的哈希密码。实现php系统和C#系统的密码互通。&lt;br /&gt;
例如：将php系统迁移到&amp;nbsp;.NetCore的系统。&lt;br /&gt;
或者混合使用php系统和.NetCore系统。&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;一种保底的实现，间接方式&lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;使用php开发一个api接口，公开给C#调用。&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;直接C#实现的方式&lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;txt_main&quot;&gt;php的&amp;nbsp;password_hash&amp;nbsp;使用的是Blowfish加密算法。我们避免重复造轮子，可以利用现成的类库【CryptSharp】。&lt;br /&gt;
&lt;strong&gt;C#中实现的验证密码代码如下：&lt;/strong&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_ipst5TCVriBb&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_ipst5TCVriBb);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_ipst5TCVriBb&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using CryptSharp&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;//等价于PHP的 password_verify 函数&lt;br /&gt;
// 验证密码是正确&lt;br /&gt;
// inputPassword 用户输入的密码&lt;br /&gt;
// hashcryptedPassword PHP的password_hash哈希加密的密码&lt;br /&gt;
//&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;bool isOK &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Crypter&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;CheckPassword&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;inputPassword&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;hashcryptedPassword&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
 &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;当然我们也可以在C#中实现PHP&amp;nbsp;password_hash&amp;nbsp;等效的加密功能：&lt;/strong&gt;&lt;br /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;window.attachEvent(&quot;onload&quot;,function (){AutoSizeDIV(&#039;CODE_K89iQs5jm4bD&#039;)})&lt;/script&gt;&lt;table width=&quot;98%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;code_head&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;a href=&quot;javascript:CopyText(document.all.CODE_K89iQs5jm4bD);&quot;&gt;[复制到剪贴板] &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;code_main&quot; id=&quot;CODE_K89iQs5jm4bD&quot; style=&quot;overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;&quot;&gt;&lt;pre&gt;&lt;code style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;using CryptSharp&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;//等效于PHP的 password_hash 函数&lt;br /&gt;
// 和PHP使用相同的加密算法： Blowfish crypt (&quot;BCrypt&quot;) &lt;br /&gt;
//&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;string hashcryptedPassword &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Crypter&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Blowfish&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;Crypt&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;
 &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;类库【CryptSharp】下载&lt;/h2&gt;&lt;br /&gt;
&lt;img src=&quot;/images/download.gif&quot; align=&quot;absmiddle&quot; /&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://dl.rickw.cn/f/20272120-983481994-5d0dbe&quot;&gt;C#加密库CryptSharp_2_1_0.zip&lt;/a&gt;&lt;br /&gt;
</content>
</entry>
</feed>