﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-永不言拜</title><link>http://www.cnblogs.com/genson/</link><description>莫等待，光阴不会复来。</description><language>zh-cn</language><lastBuildDate>Wed, 20 Aug 2008 12:23:29 GMT</lastBuildDate><pubDate>Wed, 20 Aug 2008 12:23:29 GMT</pubDate><ttl>60</ttl><item><title>FindPrivateKey </title><link>http://www.cnblogs.com/genson/archive/2008/07/26/1252207.html</link><dc:creator>菜无罪1</dc:creator><author>菜无罪1</author><pubDate>Sat, 26 Jul 2008 12:19:00 GMT</pubDate><guid>http://www.cnblogs.com/genson/archive/2008/07/26/1252207.html</guid><wfw:comment>http://www.cnblogs.com/genson/comments/1252207.html</wfw:comment><comments>http://www.cnblogs.com/genson/archive/2008/07/26/1252207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/genson/comments/commentRss/1252207.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/genson/services/trackbacks/1252207.html</trackback:ping><description><![CDATA[找与证书存储区中的特定 X.509 证书关联的私钥文件的位置和名称可能很困难。 使用 FindPrivateKey.exe 工具可以更快地完成此过程。
<p>X.509 证书是由计算机管理员或计算机上的任何用户安装的。 但是，该证书可以由使用其他帐户（例如 Windows XP 上的 ASPNET 或 Windows Server 2003 上的 NETWORK SERVICE 帐户）运行的服务来访问。</p>
<p>此帐户可能没有访问私钥文件的权限，因为证书原来并不是由它安装的。 FindPrivateKey 工具可以为您提供给定 X.509 证书的私钥文件的位置。 您可以在知道特定 X.509 证书的私钥文件的位置后立即添加或移除对此文件的权限。</p>
<p>使用证书确保安全性的示例在 Setup.bat 文件中使用 FindPrivateKey 工具。 找到私钥文件后，您可以使用其他工具（如 Cacls.exe）设置该文件的适当访问权限。 </p>
<p>使用用户帐户（如自承载可执行文件）运行 Windows Communication Foundation (WCF) 服务时，请确保该用户帐户具有该文件的只读访问权限。 使用 Internet 信息服务 (IIS) 运行 WCF 服务时，该服务使用的默认帐户是 Windows XP 上的 ASPNET 或 Windows Server 2003 上的 NETWORK SERVICE，该帐户默认情况下没有私钥文件的访问权限。 </p>
<h2 class="heading">示例</h2>
<div class="seeAlsoNoToggleSection" id="sectionSection0">
<p>访问进程没有读取特权的证书时，您将看到类似如下示例的异常消息。</p>
<div class="code"><span codelanguage="other">
<table cellspacing="0" cellpadding="0" width="100%">
    <tr>
            <th>&nbsp;</th>
            <th><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" alt="CopyCode image" src="http://www.cnblogs.com/genson/admin/ms-help://MS.MSDNQTR.v90.chs/wcf_wf_samples/local/copycode.gif" align="absMiddle" name="ccImage" /></img>复制代码</span></th>
        </tr>
        <tr>
            <td colspan="2">
            <pre>System.ArgumentException was unhandled
            Message="The certificate 'CN=localhost' must have a private key that is capable of key exchange.  The process must have access rights for the private key."
            Source="System.ServiceModel"</pre>
            </td>
        </tr>
    </table>
</span></div>
<p>发生这种情况时，可以使用 FindPrivateKey 工具查找私钥文件，然后为服务正在其中运行的进程设置访问权限。 例如，可以使用下面示例中所示的 Cacls.exe 工具完成此操作。</p>
<div class="code"><span codelanguage="other">
<table cellspacing="0" cellpadding="0" width="100%">
    <tr>
            <th>&nbsp;</th>
            <th><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" alt="CopyCode image" src="http://www.cnblogs.com/genson/admin/ms-help://MS.MSDNQTR.v90.chs/wcf_wf_samples/local/copycode.gif" align="absMiddle" name="ccImage" /></img>复制代码</span></th>
        </tr>
        <tr>
            <td colspan="2">
            <pre>cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /E /G "NETWORK SERVICE":R</pre>
            </td>
        </tr>
    </table>
</span></div>
<h3 class="subHeading">生成 FindPrivateKey 项目</h3>
<div class="subSection">
<ol>
    <li>
    <p>打开 Windows 资源管理器，然后定位到安装示例的目录位置下的语言特定的子目录。</p>
    </li>
    <li>
    <p>双击 .sln 文件图标，在 Visual Studio 中打开该文件。</p>
    </li>
    <li>
    <p>在<strong>&#8220;生成&#8221;</strong>菜单中选择<strong>&#8220;重新生成解决方案&#8221;</strong>。 客户端程序文件在 client\bin 中生成，服务程序文件在 service\bin 中生成。 </p>
    </li>
    <li>
    <p>生成解决方案将生成如下文件：FindPrivateKey.exe。</p>
    </li>
</ol>
</div>
</div>
<h2 class="heading">约定 - 命令行条目</h2>
<div class="seeAlsoNoToggleSection" id="sectionSection1">
<p>&#8220;[<em>选项</em>]&#8221;代表一组可选参数。</p>
<p>&#8220;{<em>选项</em>}&#8221;代表一组强制参数。</p>
<p>&#8220;<em>选项1</em> | <em>选项2</em>&#8221;代表一组选项中的一个选项。</p>
<p>&#8220;&lt;<em>值</em>&gt;&#8221;代表要输入的参数值。</p>
</div>
<h2 class="heading">用法</h2>
<div class="seeAlsoNoToggleSection" id="sectionSection2">
<div class="code"><span codelanguage="other">
<table cellspacing="0" cellpadding="0" width="100%">
    <tr>
            <th>&nbsp;</th>
            <th><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" alt="CopyCode image" src="http://www.cnblogs.com/genson/admin/ms-help://MS.MSDNQTR.v90.chs/wcf_wf_samples/local/copycode.gif" align="absMiddle" name="ccImage" /></img>复制代码</span></th>
        </tr>
        <tr>
            <td colspan="2">
            <pre>FindPrivateKey &lt;storeName&gt; &lt;storeLocation&gt; [{ {-n &lt;subjectName&gt;} | {-t &lt;thumbprint&gt;} } [-f | -d | -a]]</pre>
            </td>
        </tr>
    </table>
</span></div>
<p>&nbsp;</p>
<p>其中：</p>
<div class="code"><span codelanguage="other">
<table cellspacing="0" cellpadding="0" width="100%">
    <tr>
            <th>&nbsp;</th>
            <th><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" alt="CopyCode image" src="http://www.cnblogs.com/genson/admin/ms-help://MS.MSDNQTR.v90.chs/wcf_wf_samples/local/copycode.gif" align="absMiddle" name="ccImage" /></img>复制代码</span></th>
        </tr>
        <tr>
            <td colspan="2">
            <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;subjectName&gt; The subject name of the certificate
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;thumbprint&gt;&nbsp; The thumbprint of the certificate (You can use the Certmgr.exe tool to find this)
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output file name only
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output directory only
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output absolute file name</pre>
            </td>
        </tr>
    </table>
</span></div>
<p>如果没在命令提示符中指定任何参数，将显示此帮助文本。 </p>
</div>
<h2 class="heading">示例</h2>
<div class="seeAlsoNoToggleSection" id="sectionSection3">
<p>此示例在 Current User.FindPrivateKey My CurrentUser -n "CN=localhost" 的&#8220;个人&#8221;存储区中查找主题名称为 "CN=localhost" 的证书的文件名。</p>
<p>此示例在 Current 的&#8220;个人&#8221;存储区中查找主题名称为 "CN=localhost" 的证书的文件名，并输出完整的目录路径。</p>
<div class="code"><span codelanguage="other">
<table cellspacing="0" cellpadding="0" width="100%">
    <tr>
            <th>&nbsp;</th>
            <th><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" alt="CopyCode image" src="http://www.cnblogs.com/genson/admin/ms-help://MS.MSDNQTR.v90.chs/wcf_wf_samples/local/copycode.gif" align="absMiddle" name="ccImage" /></img>复制代码</span></th>
        </tr>
        <tr>
            <td colspan="2">
            <pre>User.FindPrivateKey My CurrentUser -n "CN=localhost" -a
            </pre>
            </td>
        </tr>
    </table>
</span></div>
<p>此示例在&#8220;本地计算机&#8221;的&#8220;个人&#8221;存储区中查找指纹为 "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52" 的证书的文件名。</p>
<div class="code"><span codelanguage="other">
<table cellspacing="0" cellpadding="0" width="100%">
    <tr>
            <th>&nbsp;</th>
            <th><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" alt="CopyCode image" src="http://www.cnblogs.com/genson/admin/ms-help://MS.MSDNQTR.v90.chs/wcf_wf_samples/local/copycode.gif" align="absMiddle" name="ccImage" /></img>复制代码</span></th>
        </tr>
        <tr>
            <td colspan="2">
            <pre>FindPrivateKey My LocalMachine -t "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52" &#8211;c</pre>
            </td>
        </tr>
    </table>
</span></div>
</div>
<img src ="http://www.cnblogs.com/genson/aggbug/1252207.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41805/" target="_blank">[新闻]张亚勤一改陈永正做法 微软举报洪磊为推广Vista</a>]]></description></item><item><title>使用yield进行递归</title><link>http://www.cnblogs.com/genson/archive/2008/06/20/1226451.html</link><dc:creator>菜无罪1</dc:creator><author>菜无罪1</author><pubDate>Fri, 20 Jun 2008 03:18:00 GMT</pubDate><guid>http://www.cnblogs.com/genson/archive/2008/06/20/1226451.html</guid><wfw:comment>http://www.cnblogs.com/genson/comments/1226451.html</wfw:comment><comments>http://www.cnblogs.com/genson/archive/2008/06/20/1226451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/genson/comments/commentRss/1226451.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/genson/services/trackbacks/1226451.html</trackback:ping><description><![CDATA[<p><font face="Verdana">public partial class Controls_SectionIndex : System.Web.UI.UserControl<br />
{<br />
&nbsp;&nbsp;&nbsp; private NBearLite.Database Db = NBearLite.Database.Default;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sectionType = Convert.ToInt32(Request.QueryString["sectiontype"]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rep.DataSource = ListIndex(sectionType, 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rep.DataBind();</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; }</font></p>
<font face="Verdana">
<p><br />
&nbsp;&nbsp;&nbsp; public IEnumerable&lt;GHSection&gt; ListIndex(int sectionType, int parentID)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;SqlGHSection&gt; list = Db.Select(Tables.GHSection)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Where(Tables.GHSection.SectionType == sectionType &amp;&amp; Tables.GHSection.ParentID == parentID)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .OrderBy(Tables.GHSection.ID.Asc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ToList&lt;SqlGHSection&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (GHSection node in list)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yield return node;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (GHSection node3 in ListIndex(sectionType, node.ID))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yield return node3;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<img src ="http://www.cnblogs.com/genson/aggbug/1226451.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41802/" target="_blank">[新闻]微软Office 14即将展开Alpha测试</a>]]></description></item><item><title>通过 System.Diagnostics 监控您的应用程序</title><link>http://www.cnblogs.com/genson/archive/2008/06/11/1217287.html</link><dc:creator>菜无罪1</dc:creator><author>菜无罪1</author><pubDate>Wed, 11 Jun 2008 03:57:00 GMT</pubDate><guid>http://www.cnblogs.com/genson/archive/2008/06/11/1217287.html</guid><wfw:comment>http://www.cnblogs.com/genson/comments/1217287.html</wfw:comment><comments>http://www.cnblogs.com/genson/archive/2008/06/11/1217287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/genson/comments/commentRss/1217287.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/genson/services/trackbacks/1217287.html</trackback:ping><description><![CDATA[<h5 style="padding-top: 2px">本页内容</h5>
<table style="margin-top: 7px; margin-bottom: 12px" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr valign="top">
            <td><a href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/SystemDiag.mspx#E5"><img height="9" alt="事件日志" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" /></a></td>
            <td class="onThisPage"><a href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/SystemDiag.mspx#E5">事件日志</a></td>
        </tr>
        <tr valign="top">
            <td><a href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/SystemDiag.mspx#EOC"><img height="9" alt="性能计数器" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" /></a></td>
            <td class="onThisPage"><a href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/SystemDiag.mspx#EOC">性能计数器</a></td>
        </tr>
        <tr valign="top">
            <td><a href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/SystemDiag.mspx#EBE"><img height="9" alt="Process 类" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" /></a></td>
            <td class="onThisPage"><a href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/SystemDiag.mspx#EBE">Process 类</a></td>
        </tr>
    </tbody>
</table>
<p>问题总会有解决办法。您刚刚部署的应用程序在开发计算机上一切都好，但在生产中却出了差错。问题可能会马上显现，也可能会随着时间的推移慢慢显露。现在怎么办呢？</p>
<p>开发人员会匆忙推出代码的调试版本并重新部署，这种情形太常见了。加载这一特别版本时，通常会向磁盘上的某个文件中随机写入信息，以便开发人员以后进行研究，以弄清究竟发生了什么问题。除此之外一定还有更好的办法。</p>
<p>解决方案就在 System.Diagnostics 命名空间中，该命名空间提供了用于与事件日志、性能计数器和系统进程进行交互的类。您可以在生产应用程序中保持对此监控代码的启用，并在发生问题时查看相关信息。下面让我们看一下如何在应用程序中使用这些类。</p>
<a name="E5"></a>
<h2>事件日志</h2>
<p>无数开发人员都会通过向外部文件中写入信息来调试其应用程序。除了会在硬盘上留下少量垃圾外，此方法通常需要花费很长的时间，无法进行分类或筛选，并且极少能够提供丰富数据。那么为什么还有如此多的人使用这种方法呢？原因只是他们没有意识到使用事件日志有多么轻松。</p>
<p>让我们从耗费时间的写入事件日志的方法入手，说明相关的概念，然后研究快速而容易的方法。首先，向您的代码中添加一个导入语句来引用 System.Diagnostics 命名空间，然后在您的错误处理例程中插入以下代码：111</p>
<pre class="codeSample">&#8216; 如果源不存在，则创建该
&#8216; 源。
If Not EventLog.SourceExists("MSDNDemo") Then
EventLog.CreateEventSource("MSDNDemo", _
"CustomLog")
End If
&#8216; 创建一个 EventLog 实例并指定其
&#8216; 源。
Dim myLog As New EventLog()
myLog.Source = "MSDNDemo"
&#8216; 向事件日志中写入一个信息性条目。
myLog.WriteEntry("Hello from the event log.")
</pre>
<p>上面部分的代码会检查您是否已经创建了事件的源。大多数开发人员都会使用其应用程序的名称，从而轻松快速地从事件日志的众多条目中找出该应用程序的事件。 </p>
<p>如果源不存在，则会创建源，并将其与一个事件日志相关联。您可以使用该事件日志的现有部分，比如 Application 和 System 部分，也可以通过指定名称来创建您自己的部分（就像本演示这样）。</p>
<p>创建源之后，向事件日志中添加事件就像创建新的 EventLog 对象并将其与源相关联一样简单。本示例中仅写入了&#8220;Hello from the event log&#8221;，但您可以向 WriteEntry 方法传递详细的信息（比如堆栈跟踪），并可将任何信息放在事件日志中。</p>
<div style="width: 400px"><img height="371" alt="a" src="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/art/Diagnostics_fig01.gif" width="400" border="0" /><br />
<p class="figureCaption"><strong>图 1 用户在 Custom 部分中生成的事件日志条目</strong></p>
<div class="figureRule"></div>
</div>
<p>让此代码执行数次，您的事件日志将会显示图 1 所示的活动。您可以在 Windows&#174; 事件查看器 (%windir%\system32\eventvwr.exe) 中进行查看，如图 1 所示。您也可以从服务器资源管理器中的 Visual Studio&#174; 内部查看事件日志，如图 2 所示。如果您双击这些条目之一，您即可以查看详细信息和您的自定义错误消息（请参阅图 3）。</p>
<div style="width: 300px"><img height="300" alt="a" src="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/art/Diagnostics_fig02.gif" width="300" border="0" /><br />
<p class="figureCaption"><strong>图 2 Visual Studio 内的事件日志</strong></p>
<div class="figureRule"></div>
</div>
<p>EventLog.WriteEntry 方法具有 10 个重载，为您提供了极大的灵活性和控制能力。其中最有用的一个重载允许您指定您要记录的事件的类型。在图 1 中请注意，每个项目都为&#8220;Information&#8221;（信息）类型。对于演示目的，这就已经足够了，但在实际情况下，您可能会有大量不同的事件。WriteEntry 方法允许您提供事件类型，比如错误、警告、信息、成功审核或失败审核：</p>
<pre class="codeSample">     myLog.WriteEntry("Your error here.", _
EventLogEntryType.Error)
</pre>
<div style="width: 300px"><img height="293" alt="a" src="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/art/Diagnostics_fig03.gif" width="300" border="0" /><br />
<p class="figureCaption"><strong>图 3 用户生成的事件日志</strong></p>
<div class="figureRule"></div>
</div>
<p>下面让我们来试试使用快速而容易的方法。Visual Basic&#174; 2005 引入了 My 对象作为快速进入框架的手段。您可以使用 My 向事件日志中快速添加事件：</p>
<pre class="codeSample">My.Application.Log.WriteException( _
"Written from My", TraceEventType.Warning, _
"Additional Information")
</pre>
<p>您也可以通过 WriteEntry 方法使用 My：My.Application.Log.WriteEntry("Written from My", TraceEventType.Error)</p>
<p>但如果您调用此方法并查看事件日志，则可能会看不到消息，因为 My 对象允许您根据配置文件中的设置，将您的消息路由到不同的侦听程序。有关这一极其强大的功能的详细论述不属于本专栏文章的范围，但您可以在&#8220;<a href="http://msdn2.microsoft.com/5049kcd2.aspx" target="_blank">My.Application.Log 对象</a>&#8221;找到更多信息。 </p>
<p>使用事件日志时应当审慎，没有比应用程序在事件日志中罗里罗嗦地写满毫无价值的消息更令人讨厌的了。如果有错误、重要警告或信息，则应记录。对条目指定类型将具有极大的帮助，因为 Windows 的事件查看器可以对大多数列进行筛选。</p>
<div style="margin-top: 3px; margin-bottom: 10px"><a href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/SystemDiag.mspx#top"><img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" /></a><a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/SystemDiag.mspx#top">返回页首</a></div>
<a name="EOC"></a>
<h2>性能计数器</h2>
<p>事件日志是写入消息的理想场所，但如果想要知道应用程序运行时内部发生了什么，应该怎么办呢？此时理所当然应当选择性能计数器。</p>
<p>许多开发人员都精通于使用 Windows 性能监视器来查看 CPU 和内存的使用情况或硬盘信息（请参阅图 4）。您知道可以使用 PerformanceCounter 类添加您自己的计数器和数据点吗？当 PerformanceCounter 和 Windows 性能监视器结合使用时，就像随时可以将 EKG 计算机与您的应用程序挂钩一样。</p>
<div style="width: 400px"><img height="333" alt="a" src="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/art/Diagnostics_fig04.gif" width="400" border="0" /><br />
<p class="figureCaption"><strong>图 4 标准 Windows 性能工具</strong></p>
<div class="figureRule"></div>
</div>
<p>在讨论添加自定义计数器之前，让我们研究一下已经存在的计数器。在您的一台计算机上，打开 Visual Studio 中的服务器资源管理器，并导航到&#8220;Performance Counters&#8221;（性能计数器）。您将看到一个巨大的计数器类别列表，展开后可以显示每个类别的众多计数器（请参阅图 5）。</p>
<div style="width: 250px"><img height="349" alt="a" src="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/art/Diagnostics_fig05.gif" width="250" border="0" /><br />
<p class="figureCaption"><strong>图 5 性能计数器</strong></p>
<div class="figureRule"></div>
</div>
<p>您可以在您的应用程序中使用这些系统托管的计数器。接着展开&#8220;Memory&#8221;（内存）类别，然后展开&#8220;Available Bytes&#8221;（可用字节）计数器。将该&#8220;Available Bytes&#8221;（可用字节）计数器拖动到您的应用程序中的新 Windows 窗体上。</p>
<p>在该窗体上，放置一个标签和一个新计时器对象，使其 Enabled 属性设置为 true。添加以下代码：</p>
<pre class="codeSample">Private Sub Timer1_Tick(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = Me.PerformanceCounter1.NextValue
End Sub
</pre>
<p>这是一个非常简单的示例，在实际的应用程序中您不会这样做，但它向您显示了如何向应用程序中添加基本的监控或检索系统计数器。在实际情况下，您可以会根据某个值的状态采取行动、记录此信息或执行许多操作中的任意一项操作。 </p>
<p>很可能您打算编写一些自定义的计数器，以便监控您的应用程序在任何特定的时间的运行状况和性能。若要添加新的计数器，请在服务器资源管理器中右键单击&#8220;Performance Counters&#8221;（性能计数器）项目，然后选择&#8220;Create New Category&#8221;（创建新类别）。</p>
<p>在本示例中，让我们创建一个名为 TestCategory 的类别，并添加一个名为 TestCounter 的新计数器。这一次，您将通过代码访问该计数器。</p>
<p>首先将一个新计时器和按钮拖放到窗体上，然后向窗体中添加一个名为 counter 的私有变量：</p>
<pre class="codeSample">Private counter As PerformanceCounter
</pre>
<p>在按钮单击事件中，添加以下代码： </p>
<pre class="codeSample">&#8216;初始化计数器对象
counter = New PerformanceCounter("TestCategory", "TestCounter", False)
&#8216; 将其值设置为 0
counter.RawValue = 0
&#8216; 启动时间以更新该计数器
Timer2.Enabled = True
</pre>
<p>在计时器事件中，添加以下代码：</p>
<pre class="codeSample">   Counter.IncrementBy(New Random().Next(-5, 10))
</pre>
<p>这会导致该计数器按照 -5 到 10 之间的某个随机数递增。本示例使用了随机数，但这个数字还可以是已处理的销售或订单数、登录的用户数、记录的错误数或在您的应用程序中进行跟踪的任何有意义的事物。 </p>
<p>在启动该示例应用程序之前，请从管理工具下加载性能监视器。这一次，请单击 + 号来添加一个新计数器。在&#8220;Performance Object&#8221;（性能对象）下，您现在会看到您新创建的 TestCategory。您可以从下拉列表中选择该对象，并从计数器列表中选择 TestCounter。</p>
<p>在性能监视器运行的情况下，单击示例应用程序的按钮。您应该可以看到一个类似于图 6 的图形。</p>
<p>您在示例代码中可以看到使用了 IncrementBy 方法来增加或减少计数器的数值。如果您想要使计数器以 1 为增减幅度增加或减少，只需调用 Increment 和 Decrement 方法即可。</p>
<div style="width: 400px"><img height="282" alt="a" src="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/art/Diagnostics_fig06.gif" width="400" border="0" /><br />
<p class="figureCaption"><strong>图 6 性能监视器中显示的 TestCounter 结果</strong></p>
<div class="figureRule"></div>
</div>
<p>对于像本示例这样的使用服务器资源管理器的情形，一些开发人员会想是否可以通过代码完成所有操作。是的，您可以编写如下代码：</p>
<pre class="codeSample">   If Not
PerformanceCounterCategory.Exists("MSDNSample")
Then
PerformanceCounterCategory.Create("MSDNSample", _
"用于显示如何添加自定义计数器", _
PerformanceCounterCategoryType.SingleInstance, _
"MSDNSampleCounter", _
"用于显示如何添加自定义计数器")
End If
</pre>
<p>并将其添加到您的按钮单击事件中，以便完全通过代码创建不同的类别和计数器。如果您更新其他代码，使其指向这个类别和计数器，您将发现该项目可以完全像该示例一样运行和工作。 </p>
<div style="margin-top: 3px; margin-bottom: 10px"><a href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/SystemDiag.mspx#top"><img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" /></a><a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/SystemDiag.mspx#top">返回页首</a></div>
<a name="EBE"></a>
<h2>Process 类</h2>
<p>本专栏文章至此已经让您了解了如何使用事件日志和性能计数器；下面让我们深入研究 System.Diagnostics 命名空间的第三个方面，即 Process 类。</p>
<p>首先，让我们定义一个进程：进程就是一个运行的应用程序。在具有 Process 类和正确权限的情况下，您可以访问有关用户系统中各个进程的信息，并执行诸如启动或中止这样的操作。</p>
<p>Process 类可以让您访问大量有关应用程序或其他进程的数据。对于此处的示例，让我们提升示例应用程序的基本优先级。</p>
<p>下面是具体方案。您的应用程序正运行于一台服务器上；该应用程序是该服务器上运行的主要应用程序和功能，但由于后台任务占用了过多的处理器时间，该应用程序性能不佳。您可以执行以下两种操作之一：降低后台任务的优先级，或提升您的任务的优先级。（在大多数情况下，您不需要调整某个进程的优先级，因为 Windows 可以很好地运行多个进程并换入和换出各个进程。）</p>
<p>为了使用 Process 类，您首先需要获取对您的进程或其他进程的引用。由于您想要提升当前进程，因此您将使用：</p>
<pre class="codeSample">   Dim myProcess As Process = _
Process.GetCurrentProcess()
</pre>
<p>若要访问您的本地计算机或远程计算机上的其他进程，您需要改用 GetProcessessByName 方法：</p>
<pre class="codeSample">   Dim theProcesses() As Process = _
myprocess.GetProcessesByName( _
"ProcessName", "MachineName")
</pre>
<p>获得了进程引用后，您可以使用其属性找到有关该进程的大量信息。有关属性的完整列表，请参阅&#8220;<a href="http://msdn2.microsoft.com/library/system.diagnostics.process_members.aspx" target="_blank">.NET Framework Class Library Process Members</a>&#8221;（英文）。 </p>
<p>提升优先级仅需要一行代码：</p>
<pre class="codeSample">myProcess.PriorityClass = ProcessPriorityClass.RealTime
</pre>
<p>您已将应用程序提升为 RealTime。这是您在 OS 中可以设置的最高级别，它可以使应用程序的优先级高于几乎任何其他进程。如果您的应用程序占用所有系统资源，则可能会导致问题。启动任务管理器，以确定 OS 能够看到已提升的该应用程序，如图 7 所示。 </p>
<div style="width: 400px"><img height="397" alt="a" src="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/art/Diagnostics_fig07.gif" width="400" border="0" /><br />
<p class="figureCaption"><strong>图 7 提升至 RealTime</strong></p>
<div class="figureRule"></div>
</div>
<p>您可以使用 process 命令执行大量常见任务。现在假设您想要以最小化方式启动 Microsoft Internet Explorer&#174;，并导航到 Visual Basic Developer Center。您只需使用以下代码即可：</p>
<pre class="codeSample">Dim startInfo As New ProcessStartInfo("IExplore.exe")
startInfo.WindowStyle = ProcessWindowStyle.Minimized
startInfo.Arguments = "msdn.microsoft.com/vbasic"
Process.Start(startInfo)
</pre>
<p>Process 类还适合于打印。 </p>
<pre class="codeSample">Dim myDocumentsPath As String = _
Environment.GetFolderPath(Environment.SpecialFolder.Personal)
myProcess.StartInfo.FileName = myDocumentsPath + "\MyFile.doc"
myProcess.StartInfo.Verb = "Print"
myProcess.StartInfo.CreateNoWindow = True
myProcess.Start()
</pre>
<p>您可以看到，System.Diagnostics 命名空间有许多用途：从向事件日志中记录事件到读写性能计数器，再到处理系统进程。这是一组功能异常强大、用途极为广泛的工具，每个开发人员都应熟悉并在工作中使用。</p>
<p>请将您的问题和意见发送至 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#97;&#115;&#105;&#99;&#115;&#64;&#109;&#105;&#99;&#114;&#111;&#115;&#111;&#102;&#116;&#46;&#99;&#111;&#109;" target="_blank">basics@microsoft.com</a>。</p>
<p>Brad McCabe 是 Microsoft 的一位项目经理，除了其他事务外，他还负责 MSDN 上的 Visual Basic Developer Center。</p>
<p>本文摘自 <a href="http://msdn.microsoft.com/msdnmag/issues/06/07/default.aspx" target="_blank">2006 年 7 月</a>出版的<a href="http://msdn.microsoft.com/msdnmag/default.aspx" target="_blank">《MSDN Magazine》</a>。 </p>
<p><a href="http://www.microsoft.com/china/misc/cpyright.htm" target="_blank">&#169; 2006 Microsoft Corporation 版权所有。保留所有权利。使用规定。 </a></p>
<img src ="http://www.cnblogs.com/genson/aggbug/1217287.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41801/" target="_blank">[新闻]《星际争霸2》新图</a>]]></description></item><item><title>JavaScript 获取浏览器的显示区域大小信息</title><link>http://www.cnblogs.com/genson/archive/2008/05/13/1194751.html</link><dc:creator>菜无罪1</dc:creator><author>菜无罪1</author><pubDate>Tue, 13 May 2008 02:39:00 GMT</pubDate><guid>http://www.cnblogs.com/genson/archive/2008/05/13/1194751.html</guid><wfw:comment>http://www.cnblogs.com/genson/comments/1194751.html</wfw:comment><comments>http://www.cnblogs.com/genson/archive/2008/05/13/1194751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/genson/comments/commentRss/1194751.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/genson/services/trackbacks/1194751.html</trackback:ping><description><![CDATA[摘要: 区域说明 JavaScript Code 网页可见区域宽 document.body.clientWidth 网页可见区域高 document.body.clientHeight 网页可见区域宽(包括边线的宽) document.body.offsetWidth 网页可见区域高(包括边线的宽) document.body.offsetHeight 网页正文全文宽 document.body.scr&nbsp;&nbsp;<a href='http://www.cnblogs.com/genson/archive/2008/05/13/1194751.html'>阅读全文</a><img src ="http://www.cnblogs.com/genson/aggbug/1194751.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41800/" target="_blank">[新闻]Google放出Android开发路线图</a>]]></description></item><item><title>10款让你震撼的图片展示js代码</title><link>http://www.cnblogs.com/genson/archive/2008/03/26/1122455.html</link><dc:creator>菜无罪1</dc:creator><author>菜无罪1</author><pubDate>Wed, 26 Mar 2008 01:07:00 GMT</pubDate><guid>http://www.cnblogs.com/genson/archive/2008/03/26/1122455.html</guid><wfw:comment>http://www.cnblogs.com/genson/comments/1122455.html</wfw:comment><comments>http://www.cnblogs.com/genson/archive/2008/03/26/1122455.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/genson/comments/commentRss/1122455.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/genson/services/trackbacks/1122455.html</trackback:ping><description><![CDATA[<strong><font style="font-size: 14px">&nbsp;10款让你震撼的图片展示js代码</font></strong><br />
<font face="Verdana">http://www.zcool.com.cn/jscode/javascript/20080325/code_032543362008.html</font> <br />
<img alt="" src="http://smallpic.zcool.com.cn/code/js/04_b1.jpg" /><br />
1.预览地址：<br />
<a href="http://preview.zcool.com.cn/code/js/04/1/" target="_blank">http://preview.zcool.com.cn/code/js/04/1/</a><br />
<br />
<img alt="" src="http://smallpic.zcool.com.cn/code/js/04_b2.jpg" /><br />
2.预览地址：<br />
<a href="http://preview.zcool.com.cn/code/js/04/2/" target="_blank">http://preview.zcool.com.cn/code/js/04/2/</a><br />
<br />
<img alt="" src="http://smallpic.zcool.com.cn/code/js/04_b3.jpg" /><br />
3.预览地址：<br />
<a href="http://preview.zcool.com.cn/code/js/04/3/" target="_blank">http://preview.zcool.com.cn/code/js/04/3/</a><br />
<br />
<img alt="" src="http://smallpic.zcool.com.cn/code/js/04_b4.jpg" /><br />
4.预览地址：<br />
<a href="http://preview.zcool.com.cn/code/js/04/4/" target="_blank">http://preview.zcool.com.cn/code/js/04/4/</a><br />
<br />
<img alt="" src="http://smallpic.zcool.com.cn/code/js/04_b5.jpg" /><br />
5.预览地址：<br />
<a href="http://preview.zcool.com.cn/code/js/04/5/" target="_blank">http://preview.zcool.com.cn/code/js/04/5/</a>
<div class="Kru227">www.zcool.com.cn</div>
<br />
<br />
<img alt="" src="http://smallpic.zcool.com.cn/code/js/04_b6.jpg" /><br />
6.预览地址：<br />
<a href="http://preview.zcool.com.cn/code/js/04/6/" target="_blank">http://preview.zcool.com.cn/code/js/04/6/</a><br />
<br />
<img alt="" src="http://smallpic.zcool.com.cn/code/js/04_b7.jpg" /><br />
7.预览地址：<br />
<a href="http://preview.zcool.com.cn/code/js/04/7/" target="_blank">http://preview.zcool.com.cn/code/js/04/7/</a><br />
<br />
<img alt="" src="http://smallpic.zcool.com.cn/code/js/04_b8.jpg" /><br />
8.预览地址：<br />
<a href="http://preview.zcool.com.cn/code/js/04/8/" target="_blank">http://preview.zcool.com.cn/code/js/04/8/</a><br />
<br />
<img alt="" src="http://smallpic.zcool.com.cn/code/js/04_b9.jpg" /><br />
9.预览地址：<br />
<a href="http://preview.zcool.com.cn/code/js/04/9/" target="_blank">http://preview.zcool.com.cn/code/js/04/9/</a><br />
<br />
<img alt="" src="http://smallpic.zcool.com.cn/code/js/04_b10.jpg" /><br />
10预览地址：<br />
<a href="http://preview.zcool.com.cn/code/js/04/10/" target="_blank">http://preview.zcool.com.cn/code/js/04/10/</a> <span class="Kru227">www.zcool.com.cn</span> <br />
<br />
10款能与flash效果相比拼得js图片展示代码，感谢YOKT报料<br />
<a href="http://bbs.blueidea.com/thread-2839760-1-1.html" target="_blank">http://bbs.blueidea.com/thread-2839760-1-1.html</a>&#8230;&#8230; <br />
<br />
高级程序员，网站架构师，从事软件开发多年，，承接B/S架构相关项目。有意者请联系QQ:20028205 
<img src ="http://www.cnblogs.com/genson/aggbug/1122455.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41799/" target="_blank">[新闻]番茄花园作者被警方逮捕</a>]]></description></item><item><title>ADO.NET2.0异步查询方法学习 </title><link>http://www.cnblogs.com/genson/archive/2008/03/01/1087168.html</link><dc:creator>菜无罪1</dc:creator><author>菜无罪1</author><pubDate>Sat, 01 Mar 2008 05:44:00 GMT</pubDate><guid>http://www.cnblogs.com/genson/archive/2008/03/01/1087168.html</guid><wfw:comment>http://www.cnblogs.com/genson/comments/1087168.html</wfw:comment><comments>http://www.cnblogs.com/genson/archive/2008/03/01/1087168.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/genson/comments/commentRss/1087168.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/genson/services/trackbacks/1087168.html</trackback:ping><description><![CDATA[<p><font face="Verdana">public&nbsp; string ConStr = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;<br />
&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)<br />
&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!IsPostBack)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BindData();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //BindMultiData();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //BindMultiDataArray();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //BindDataWithCallBack();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; //异步查询的poll方式，最普通的方式<br />
&nbsp;&nbsp;&nbsp; private void BindData()<br />
&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string QueryStr = "SELECT * FROM customers";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (SqlConnection Con = new SqlConnection(ConStr))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand Cmd = new SqlCommand(QueryStr, Con);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IAsyncResult ASynResult;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader Da;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Con.Open();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //begin方法返回一个IAsyncResult对象，用来检查执行是否完成<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASynResult = Cmd.BeginExecuteReader(CommandBehavior.CloseConnection);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (!ASynResult.IsCompleted)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write("异步查询&lt;/br&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASynResult.AsyncWaitHandle.WaitOne(3000, true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.Threading.Thread.Sleep(10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Da = Cmd.EndExecuteReader(ASynResult);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView1.DataSource = Da;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView1.DataBind();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(ex.Message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; }</font></p>
<font face="Verdana">
<p><br />
&nbsp;&nbsp;&nbsp; //异步查询的wait方式，使用多个等待句柄来异步查询，必须等待所有进程完成处理结果集<br />
&nbsp;&nbsp;&nbsp; private void BindMultiData()<br />
&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string CusQueryStr = "SELECT * FROM customers WHERE CompanyName = 'Alfreds Futterkiste'";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string SupQueryStr = "SELECT Customers.CompanyName, Customers.ContactName, " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Orders.OrderID, Orders.OrderDate, " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Orders.RequiredDate, Orders.ShippedDate " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "FROM Orders, Customers " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "WHERE Orders.CustomerID = Customers.CustomerID " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "AND Customers.CompanyName = 'Alfreds Futterkiste' " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ORDER BY Customers.CompanyName, Customers.ContactName";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (SqlConnection MyCon = new SqlConnection(ConStr))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand CusCmd = new SqlCommand(CusQueryStr, MyCon);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand SupCmd = new SqlCommand(SupQueryStr, MyCon);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader CusDr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader SupDr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IAsyncResult CusIsynResult;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IAsyncResult SupIsynResult;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建句柄数组<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.WaitHandle[] WHandles = new System.Threading.WaitHandle[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.WaitHandle CusHandle;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.WaitHandle SupHandle;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyCon.Open();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CusIsynResult = CusCmd.BeginExecuteReader(CommandBehavior.CloseConnection);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SupIsynResult = SupCmd.BeginExecuteReader(CommandBehavior.CloseConnection);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CusHandle = CusIsynResult.AsyncWaitHandle;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SupHandle = SupIsynResult.AsyncWaitHandle;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将等待句柄赋给句柄数组<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHandles[0] = CusHandle;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHandles[1] = SupHandle;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将数组传给waitall方法，等待所以的异步查询完成<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.WaitHandle.WaitAll(WHandles);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CusDr = CusCmd.EndExecuteReader(CusIsynResult);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SupDr = SupCmd.EndExecuteReader(SupIsynResult);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView1.DataSource = CusDr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView1.DataBind();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView2.DataSource = SupDr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView2.DataBind();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyCon.Dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CusCmd.Dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SupCmd.Dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; //采用WaitAny方式，优点是不用等待所有进程都完成才处理结果集<br />
&nbsp;&nbsp;&nbsp; private void BindMultiDataArray()<br />
&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string CusQueryStr = "SELECT * FROM customers WHERE CompanyName = 'Alfreds Futterkiste'";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string SupQueryStr = "SELECT Customers.CompanyName, Customers.ContactName, " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Orders.OrderID, Orders.OrderDate, " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Orders.RequiredDate, Orders.ShippedDate " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "FROM Orders, Customers " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "WHERE Orders.CustomerID = Customers.CustomerID " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "AND Customers.CompanyName = 'Alfreds Futterkiste' " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ORDER BY Customers.CompanyName, Customers.ContactName";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (SqlConnection MyCon = new SqlConnection(ConStr))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand CusCmd = new SqlCommand(CusQueryStr, MyCon);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand SupCmd = new SqlCommand(SupQueryStr, MyCon);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader CusDr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader SupDr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IAsyncResult CusIsynResult;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IAsyncResult SupIsynResult;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.WaitHandle[] WHandles = new System.Threading.WaitHandle[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.WaitHandle CusHandle;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.WaitHandle SupHandle;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int WHindex;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyCon.Open();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CusIsynResult = CusCmd.BeginExecuteReader(CommandBehavior.CloseConnection);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SupIsynResult = SupCmd.BeginExecuteReader(CommandBehavior.CloseConnection);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CusHandle = CusIsynResult.AsyncWaitHandle;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SupHandle = SupIsynResult.AsyncWaitHandle;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHandles[0] = CusHandle;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHandles[1] = SupHandle;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; WHandles.Length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //waitany好处在于不必等待所有异步操作完成<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHindex = System.Threading.WaitHandle.WaitAny(WHandles);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (WHindex)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CusDr = CusCmd.EndExecuteReader(CusIsynResult);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView1.DataSource = CusDr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView1.DataBind();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SupDr = SupCmd.EndExecuteReader(SupIsynResult);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView2.DataSource = SupDr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView2.DataBind();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyCon.Dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CusCmd.Dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SupCmd.Dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; //通过回调来实现异步查询<br />
&nbsp;&nbsp;&nbsp; private void BindDataWithCallBack()<br />
&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string SupQueryStr = "SELECT Customers.CompanyName, Customers.ContactName, " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Orders.OrderID, Orders.OrderDate, " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Orders.RequiredDate, Orders.ShippedDate " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "FROM Orders, Customers " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "WHERE Orders.CustomerID = Customers.CustomerID " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "AND Customers.CompanyName = 'Alfreds Futterkiste' " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ORDER BY Customers.CompanyName, Customers.ContactName";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (SqlConnection MyCon = new SqlConnection(ConStr))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand SupCmd = new SqlCommand(SupQueryStr, MyCon);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader SupDr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IAsyncResult SupIsynResult;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyCon.Open();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AsyncCallback Callback = new AsyncCallback(CallBackMethod);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SupIsynResult = SupCmd.BeginExecuteReader(Callback, SupCmd,CommandBehavior.CloseConnection);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.Thread.Sleep(100);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyCon.Dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SupCmd.Dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; //回调方法<br />
&nbsp;&nbsp;&nbsp; public void CallBackMethod(IAsyncResult IResult)<br />
&nbsp;&nbsp;&nbsp; ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand Command = (SqlCommand)IResult.AsyncState;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader dr = Command.EndExecuteReader(IResult);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView1.DataSource = dr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridView1.DataBind();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考：http://www.zxbc.cn/html/adonet/1713241149778_2.html<br />
<font face="Verdana">永不言败</font>：高级程序员，网站架构师。从事软件开发多年，，承接B/S架构相关项目。有意者请联系QQ:20028205 </font></p>
<img src ="http://www.cnblogs.com/genson/aggbug/1087168.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41792/" target="_blank">[新闻]WordPress和Movable Type影响社交网站的未来</a>]]></description></item><item><title>关于控件postback 后viewstate加载失败的问题</title><link>http://www.cnblogs.com/genson/archive/2008/02/03/1063463.html</link><dc:creator>菜无罪1</dc:creator><author>菜无罪1</author><pubDate>Sun, 03 Feb 2008 04:54:00 GMT</pubDate><guid>http://www.cnblogs.com/genson/archive/2008/02/03/1063463.html</guid><wfw:comment>http://www.cnblogs.com/genson/comments/1063463.html</wfw:comment><comments>http://www.cnblogs.com/genson/archive/2008/02/03/1063463.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/genson/comments/commentRss/1063463.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/genson/services/trackbacks/1063463.html</trackback:ping><description><![CDATA[摘要: 我写了一个控件Inherits TextBox，里面有一个复杂属性Tip，但每次postback的时候都说加载viewstate失败，除非我在!postback的情况下给Tip.xxx赋值.下面我贴出代码，我已经搞了一天了，搞不出什么原因。JTextBox控件usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel&nbsp;&nbsp;<a href='http://www.cnblogs.com/genson/archive/2008/02/03/1063463.html'>阅读全文</a><img src ="http://www.cnblogs.com/genson/aggbug/1063463.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41791/" target="_blank">[新闻]谷歌平台手机获准上市</a>]]></description></item><item><title>利用泛型进行网站序列化配置</title><link>http://www.cnblogs.com/genson/archive/2008/01/29/1051625.html</link><dc:creator>菜无罪1</dc:creator><author>菜无罪1</author><pubDate>Tue, 29 Jan 2008 06:06:00 GMT</pubDate><guid>http://www.cnblogs.com/genson/archive/2008/01/29/1051625.html</guid><wfw:comment>http://www.cnblogs.com/genson/comments/1051625.html</wfw:comment><comments>http://www.cnblogs.com/genson/archive/2008/01/29/1051625.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/genson/comments/commentRss/1051625.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/genson/services/trackbacks/1051625.html</trackback:ping><description><![CDATA[摘要: 本文源码：/Files/genson/Site_Config_demo.rar发布日期：2008－1－29适用于vs2005,asp.net2.0或以上版本前言在开发网站的时候，我们通常都需要做一些配置，把配置保存在数据库或者文本中，比如开发一个论坛程序，我们有邮箱配置，缓存配置，相册配置，回复帖子配置，图片水印配置，页面关键字配置等等，这么多配置。 我们可以用数据库把所有配置都保存到一个表中，但&nbsp;&nbsp;<a href='http://www.cnblogs.com/genson/archive/2008/01/29/1051625.html'>阅读全文</a><img src ="http://www.cnblogs.com/genson/aggbug/1051625.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41790/" target="_blank">[新闻]微软自称传媒公司 强调搜索引擎三大趋势</a>]]></description></item><item><title>C#中奇妙的操作符重载</title><link>http://www.cnblogs.com/genson/archive/2008/01/19/1045323.html</link><dc:creator>菜无罪1</dc:creator><author>菜无罪1</author><pubDate>Sat, 19 Jan 2008 04:50:00 GMT</pubDate><guid>http://www.cnblogs.com/genson/archive/2008/01/19/1045323.html</guid><wfw:comment>http://www.cnblogs.com/genson/comments/1045323.html</wfw:comment><comments>http://www.cnblogs.com/genson/archive/2008/01/19/1045323.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/genson/comments/commentRss/1045323.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/genson/services/trackbacks/1045323.html</trackback:ping><description><![CDATA[摘要: 细心的朋友可能发现，C#虽然可以重载操作符，但和C++比较起来，却有很大的不同。定义的时候重载操作符方法必须是static，而且至少有一个参数（一目和二目分别是一个和两个），C#和C++比起来，最重要的特征是：&lt;、&gt;；==、!=；true、false必须成对出现，即重载了&#8220;&lt;&#8221;就必须重载&#8220;&gt;&#8221;，重载了&#8220;==&#82&nbsp;&nbsp;<a href='http://www.cnblogs.com/genson/archive/2008/01/19/1045323.html'>阅读全文</a><img src ="http://www.cnblogs.com/genson/aggbug/1045323.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41789/" target="_blank">[新闻]亚洲社交网站Friendster将兼容竞争对手窗件</a>]]></description></item><item><title>ASP.NET2.0 制作ACCESS版用户登录</title><link>http://www.cnblogs.com/genson/archive/2007/12/24/1012096.html</link><dc:creator>菜无罪1</dc:creator><author>菜无罪1</author><pubDate>Mon, 24 Dec 2007 01:35:00 GMT</pubDate><guid>http://www.cnblogs.com/genson/archive/2007/12/24/1012096.html</guid><wfw:comment>http://www.cnblogs.com/genson/comments/1012096.html</wfw:comment><comments>http://www.cnblogs.com/genson/archive/2007/12/24/1012096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/genson/comments/commentRss/1012096.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/genson/services/trackbacks/1012096.html</trackback:ping><description><![CDATA[<p>方法一: (原文地址<a href="http://blog.csdn.net/gaeml/archive/2007/03/01/1518721.aspx">http://blog.csdn.net/gaeml/archive/2007/03/01/1518721.aspx</a>)</p>
<p>1、<span>首先你需要一个A</span><span><font face="Times New Roman">ccess</font></span><span>的</span><span><font face="Times New Roman">Provider</font></span><span>以及相对应的数据库。之前我曾经从网上找了很多A</span><span><font face="Times New Roman">ccess</font></span><span>的P</span><span><font face="Times New Roman">rovider</font></span><span>，并把</span><span><font face="Times New Roman">SQLServer</font></span><span>版的表导出成</span><span><font face="Times New Roman">Access</font></span><span>，结果发现这条路是行不通的</span><span><font face="Times New Roman">,</font></span><span>因为不匹配（Access版的由3个字段构成而SQLServer版的由4个字段构成）。<br />
2、我们在做之前还要到微软去下载个<span><font face="Times New Roman">SampleAccessProviders.vsi，安装后里面有个ASPNetDB.MDB数据库、Access.csproj文件Web.config等文件，SampleAccessProviders.vsi的安装后可以在C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Templates\ProjectTemplates\Visual Web Developer找到。Web.config不需配置就可以使用了，也可以根据你的需要配置。SampleAccessProviders.vsi的下载地址:<br />
<span><a href="http://msdn.microsoft.com/vstudio/eula.aspx?id=96713a8e-b8d4-4d6e-bb8f-027e6c8e15d8" target="_blank"><u><font face="Times New Roman" color="#800080" size="3">http://msdn.microsoft.com/vstudio/eula.aspx?id=96713a8e-b8d4-4d6e-bb8f-027e6c8e15d8</font></u></a><br />
3、用VS2005等编译软件把Access.csproj<span>编译出</span><span><font face="Times New Roman">dll，<span>名字为</span><span><font face="Times New Roman">SampleAccessProviders.dll，<span>然后把</span><span><font face="Times New Roman">ASPNetDB.mdb</font></span><span>复制到</span><span><font face="Times New Roman">App_Data</font></span><span>目录，然后在自己的网站中引用</span><span><font face="Times New Roman">SampleAccessProviders.dll<span>即可，也就是说把这个文件拷贝到Bin文件夹中。<br />
4、说明：你也可以用我编译好了的<span title="点击下载"><a href="http://www.onlinegf.com/users/lion/Study/summarize/images/SampleAccessProviders.dll">SampleAccessProviders.dll</a>和<a href="http://www.onlinegf.com/users/lion/Study/summarize/images/SampleAccessProviders.zip">SampleAccessProviders.vsi</a></span></span></font></span></font></span></font></span></span></font></span></span> (这两个文件可以在<a href="http://www.onlinegf.com/users/lion/">http://www.onlinegf.com/users/lion/</a>中下载得到。)</p>
<p>方法二: </p>
<p>安装sampleaccessproviders.vsi后 <br />
<br />
1.新建一个这个startkit项目，在资源管理器里拷贝App_Code和App_Data两个文件夹的所有内容（包括文件夹）覆盖你所建的网站跟文件夹 <br />
<br />
2.修改web.config文件，如果没有就建一个，提供一个样例内容如下： <br />
<br />
<br />
&lt;?xml version="1.0"?&gt; <br />
<br />
&lt;configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"&gt; <br />
&lt;appSettings/&gt; <br />
<br />
&lt;!--以下为ACCESS连接字符串配置 by ddt/丁涛 <br />
--&gt; <br />
&lt;connectionStrings&gt; <br />
&lt;add name="PersonalAccessProvider" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|ASPNetDB.mdb" providerName="System.Data.OleDb"/&gt; <br />
&lt;/connectionStrings&gt; <br />
<br />
&lt;system.web&gt; <br />
&lt;!-- <br />
设置 compilation debug="true" 将调试符号插入 <br />
已编译的页面中。但由于这会 <br />
影响性能，因此只在开发过程中将此值 <br />
设置为 true。 <br />
--&gt; <br />
&lt;compilation debug="true"/&gt; <br />
&lt;!-- <br />
通过 &lt;authentication&gt; 节可以配置 ASP.NET 使用的 <br />
安全身份验证模式， <br />
以标识传入的用户。 <br />
--&gt; <br />
&lt;authentication mode="Forms" /&gt; <br />
&lt;!-- <br />
如果在执行请求的过程中出现未处理的错误， <br />
则通过 &lt;customErrors&gt; 节可以配置相应的处理步骤。具体说来， <br />
开发人员通过该节可以配置 <br />
要显示的 html 错误页 <br />
以代替错误堆栈跟踪。 <br />
<br />
&lt;customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"&gt; <br />
&lt;error statusCode="403" redirect="NoAccess.htm" /&gt; <br />
&lt;error statusCode="404" redirect="FileNotFound.htm" /&gt; <br />
&lt;/customErrors&gt; <br />
--&gt; <br />
&lt;!--以下为使用ACCESS提供程序的配置 by ddt/龙平 <br />
--&gt; <br />
&lt;membership defaultProvider="AccessMembershipProvider"&gt; <br />
&lt;providers&gt; <br />
&lt;clear/&gt; <br />
&lt;add name="AccessMembershipProvider" <br />
type="AccessProviders.AccessMembershipProvider" <br />
connectionStringName="PersonalAccessProvider" <br />
enablePasswordRetrieval="false" <br />
enablePasswordReset="false" <br />
requiresUniqueEmail="false" <br />
requiresQuestionAndAnswer="false" <br />
minRequiredPasswordLength="1" <br />
minRequiredNonalphanumericCharacters="0" <br />
applicationName="personalSite" <br />
hashAlgorithmType="SHA1" <br />
passwordFormat="Hashed"/&gt; <br />
&lt;/providers&gt; <br />
&lt;/membership&gt; <br />
&lt;roleManager enabled="true" cacheRolesInCookie="true" defaultProvider="AccessRoleProvider"&gt; <br />
&lt;providers&gt; <br />
&lt;add connectionStringName="PersonalAccessProvider" applicationName="personalSite" <br />
name="AccessRoleProvider" type="AccessProviders.AccessRoleProvider" /&gt; <br />
&lt;/providers&gt; <br />
&lt;/roleManager&gt; <br />
&lt;profile enabled="true" defaultProvider="AccessProfileProvider"&gt; <br />
&lt;providers&gt; <br />
&lt;add name="AccessProfileProvider" <br />
type="AccessProviders.AccessProfileProvider" <br />
connectionStringName="PersonalAccessProvider" <br />
applicationName="personalSite" <br />
description="Stores and retrieves profile data from an Personal Starter Kit MS Access1 database."/&gt; <br />
&lt;/providers&gt; <br />
&lt;properties&gt; <br />
&lt;add name="FriendlyName" type="string" allowAnonymous="true" serializeAs="String"/&gt; <br />
&lt;add name="Height" type="int" allowAnonymous="true" serializeAs="String"/&gt; <br />
&lt;add name="Weight" type="int" allowAnonymous="true" serializeAs="Xml"/&gt; <br />
&lt;/properties&gt; <br />
&lt;/profile&gt; <br />
<br />
&lt;/system.web&gt; <br />
&lt;/configuration&gt; </p>
<p>&nbsp;</p>
<p>&nbsp; <a href="/Files/genson/providermodel3.zip">/Files/genson/providermodel3.zip</a><br />
<a href="/Files/genson/SampleAccessProviders.rar">/Files/genson/SampleAccessProviders.rar</a></p>
<img src ="http://www.cnblogs.com/genson/aggbug/1012096.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41788/" target="_blank">[新闻]百度宣布服务器全面换装闪存 替代硬盘</a>]]></description></item></channel></rss>