<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Little Things]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/rabbitlzx</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; rabbitlzx]]></copyright><item><title><![CDATA[《Async in C#》番外篇 - 详细解释编译器转换后的关键方法和逻辑 ]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/158648079</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/158648079</guid><author>rabbitlzx</author><pubDate>Wed, 04 Mar 2026 15:32:49 +0800</pubDate><description><![CDATA[本文通过WinForm示例展示了C#异步方法的编译器转换过程，当对关键的方法、逻辑进行详细解释，使您能够在读完后深入理解异步的内部逻辑。]]></description><category></category></item><item><title><![CDATA[《Async in C# 5.0》第十四章 深入探讨编译器对于async的转换]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/158068356</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/158068356</guid><author>rabbitlzx</author><pubDate>Sat, 14 Feb 2026 15:35:01 +0800</pubDate><description><![CDATA[C# 编译器借助 .NET 框架基类库实现了异步功能。运行时本身无需任何更改即可支持异步。这意味着 await 是被转换成了某种使用早期版本的 C# 我们自己就可以编写的东西。我们可以使用 .NET Reflector 这样的反编译器来查看生成的代码。除了单纯的感兴趣之外，理解这些生成的代码还有助于调试、性能分析以及对异步代码进行其他诊断。]]></description><category></category></item><item><title><![CDATA[《Async in C# 5.0》第八章 我的代码运行在哪个线程上？]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/157902297</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/157902297</guid><author>rabbitlzx</author><pubDate>Fri, 13 Feb 2026 13:56:14 +0800</pubDate><description><![CDATA[摘要：本文深入探讨了C#异步编程的线程机制，指出第一个await前的代码始终运行在调用线程上，澄清了异步不会自动切换线程的常见误解。文章详细分析了异步操作生命周期中UI线程与IOCP线程的协作过程，强调SynchronizationContext在确保UI线程安全恢复中的关键作用。同时指出ConfigureAwait可优化性能但需谨慎使用，并警告同步代码调用异步方法可能导致死锁。最后通过堆栈调用示例解释了异步恢复时的&quot;上下颠倒&quot;现象，为理解异步执行流程提供了独特视角。]]></description><category></category></item><item><title><![CDATA[《Async in C# 5.0》第七章 异步代码工具集]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/156071515</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/156071515</guid><author>rabbitlzx</author><pubDate>Wed, 24 Dec 2025 16:07:33 +0800</pubDate><description><![CDATA[基于Task的异步模式（TAP），我们很容易创建处理Tasks的工具方法。所有的TAP方法都会返回一个Task，因此我们针对一个TAP方法写的所有特殊行为，都可以在其它方法上进行重用。尽管已经有很多这类工具方法了，但是将来你可能需要定义类似的工具（.NET framework未提供时），所以看看如何自己实现这样的工具方法还是很必要的。]]></description><category></category></item><item><title><![CDATA[《Async in C# 5.0》第六章 基于Task的异步模式]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/118512640</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/118512640</guid><author>rabbitlzx</author><pubDate>Tue, 06 Jul 2021 17:18:41 +0800</pubDate><description><![CDATA[基于Task的异步模式（TAP）是微软推荐的一系列使用Task类型编写异步API的方式。微软的并行编程小组的成员Stephen Toub写了一篇文章，其中包括了一些很棒的例子，很值得一读。

需要使用await调用应用了这个模式的API，同时也需要使用async关键字来产生遵循此模式的方法。通常来说，手动使用Task类型很有用。在本章中，我将介绍这个模式，以及使用它的一些技巧。

TAP约定了什么

假定我们已经知道了如何设计一个好的C#同步方法的签名：



// 未完待续

...]]></description><category></category></item><item><title><![CDATA[《Async in C# 5.0》第五章 await到底做了什么？]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/116306826</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/116306826</guid><author>rabbitlzx</author><pubDate>Fri, 30 Apr 2021 17:27:55 +0800</pubDate><description><![CDATA[有两种方式来思考C# 5.0中的async功能，特别是使用了await关键字后到底发生了什么：

作为一种语言层面上的功能，你可以学学它对应的行为是什么
	从编译期对方法进行转换的角度看，它更像是一种语法糖（syntaticsugar）
这两点就是一枚硬币的两个方面。在本章，我们会集中在第一点上来学习async。在第14章，我们会从另一个方面去进行思考，虽然这样会更复杂些，但是却会学到更多的细节，从而帮助我们理清调试和性能方面的一些考虑。

休眠以及恢复一个方法（Hibernating and Resum.]]></description><category></category></item><item><title><![CDATA[《Async in C# 5.0》第四章 编写异步方法]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/115536377</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/115536377</guid><author>rabbitlzx</author><pubDate>Fri, 09 Apr 2021 08:59:25 +0800</pubDate><description><![CDATA[现在我们知道了异步代码很棒，但是编写异步代码到底有多困难呢？是时候看一下C# 5.0中的async功能了。在第一章async做了什么一节我们提到了，如果一个方法被标注为async，则需要在方法内使用await关键字。


private async void DumpWebPageAsync(string uri)
{
   WebClient webClient = new WebClient();
   string page = await webClient.DownloadStringTaskA.]]></description><category></category></item><item><title><![CDATA[《Async in C# 5.0》第三章 手动编写异步代码]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/115065810</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/115065810</guid><author>rabbitlzx</author><pubDate>Mon, 22 Mar 2021 10:27:24 +0800</pubDate><description><![CDATA[在本章中，我们将探讨一下如何在不使用C# 5.0以及async的情况下去编写异步代码。这样做会帮助你理解异步背后到底发生了什么。基于这个原因，我会带着你快速过一下例子，然后只把需要我们重点理解的地方告诉你。

.NET中采用的一些异步模式

正如我之前所说，Silverlight只提供异步版本的API。下面是一个下载网页内容并进行显示的例子


private void DumpWebPage(Uri uri)
{
	WebClient webClient = new WebClient();
	webCl]]></description><category></category></item><item><title><![CDATA[《Async in C# 5.0》第二章 为什么程序需要以异步方式执行？]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/114888860</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/114888860</guid><author>rabbitlzx</author><pubDate>Tue, 16 Mar 2021 17:02:31 +0800</pubDate><description><![CDATA[众所周知，异步编程既重要又有用，但是为什么它如此重要却要具体问题具体分析，因为这取决于你在编写什么样的程序。有些优点到处都被提及，但真正体现这些优点的场景可能你一辈子也碰不到，如果这和你情况相符，请确保读完这一章，因为背景知识会帮助你理解整个上下文。

带用户界面的桌面程序

桌面程序有一个主要的性能需求——需要对用户操作做出响应。人机交互（HCI）调研发现：程序慢一点用户可以忍，只要用户点击后界面有响应就行（比如有一个动画进度条之类的）。但是如果程序失去响应，用户就会感到抓狂。失去相应的主要原因就是程序在]]></description><category></category></item><item><title><![CDATA[《Async in C# 5.0》第一章 引言]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/114888600</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/114888600</guid><author>rabbitlzx</author><pubDate>Tue, 16 Mar 2021 17:00:40 +0800</pubDate><description><![CDATA[阅读此书的约定

斜体字: 表示新定义的术语、URL、邮件地址、文件名、文件扩展名。

下面的图标表示：小贴士|、建议或者注释。







第一章 引言

首先，让我们从较高层次介绍一下C# 5.0中的async功能，看看它对你意味着什么。

异步编程

什么样的代码是异步的呢？如果程序开始执行耗时操作后，不会等待耗时操作结束才往下执行，这样的代码就是异步的。如果程序一直等待耗时操作结束后，才会继续往下执行，这样的代码就是阻塞代码（blocking code）。

常见的耗时操作包括下列场景：

...]]></description><category></category></item><item><title><![CDATA[翻译《Async in C# 5.0》]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/114887836</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/114887836</guid><author>rabbitlzx</author><pubDate>Tue, 16 Mar 2021 16:47:33 +0800</pubDate><description><![CDATA[本文作者在学习和使用async/await时遇到困惑，决定通过翻译Alex Davies于2012年出版的《异步编程》一书（共105页）来加深理解。作者坦承自身水平有限，译文可能存在错误，恳请读者指正。同时表示若翻译内容对读者有所帮助，希望能获得点赞支持。]]></description><category></category></item><item><title><![CDATA[Control.Invalidate, Control.Update and Control.Refresh 有什么区别]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/7754225</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/7754225</guid><author>rabbitlzx</author><pubDate>Tue, 17 Jul 2012 10:22:19 +0800</pubDate><description><![CDATA[关键字： Control.Invalidate， Control.Update， Control.Refresh
摘自：Whats the difference between Control.Invalidate, Control.Update and Control.Refresh?



Control.Invalidate() v/s Control.Update() v/s C]]></description><category></category></item><item><title><![CDATA[XmlSerializer 构造函数的性能问题]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/7681627</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/7681627</guid><author>rabbitlzx</author><pubDate>Thu, 21 Jun 2012 09:15:38 +0800</pubDate><description><![CDATA[关键字：XmlSerializer, Performace Issue 
 
 
近日在解决一个性能问题时，发现如下这段代码的执行要花费较长的时间

SuperElement = XElement.Parse(xmlcontent from resource file);
// 获取指定的内容
IEnumerable elements= SuperElement.Descendants(]]></description><category></category></item><item><title><![CDATA[找回失去的 显示桌面 Show the desktop]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/6542935</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/6542935</guid><author>rabbitlzx</author><pubDate>Tue, 14 Jun 2011 09:50:00 +0800</pubDate><description><![CDATA[1. 在随便某个地方新建个txt文件，然后将下面的内容拷贝进去 [Shell]Command=2IconFile=explorer.exe,3[Taskbar]Command=ToggleDesktop2. 将文件改名， XXX.scf，确保后缀名为scf就行3. 把这个XXX拖到开始菜单旁边的Quick Lauch区域]]></description><category></category></item><item><title><![CDATA[关于RichTextbox的一些属性]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/6541301</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/6541301</guid><author>rabbitlzx</author><pubDate>Mon, 13 Jun 2011 14:53:00 +0800</pubDate><description><![CDATA[ShowSelectionMargin 这个属性设置为true后，就会在richtextbox文本最左侧多空出1个字符的宽度，在此空白处单击鼠标左键就会选中当前正行文本，双击（或者连续单击3次？）就会做全选的操作 You can use this property to enable the user to easily select lines of text in the Rich]]></description><category></category></item><item><title><![CDATA[根据拼音首字母进行过滤的combobox]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/6146756</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/6146756</guid><author>rabbitlzx</author><pubDate>Mon, 17 Jan 2011 14:04:00 +0800</pubDate><description><![CDATA[<br />keywords: 拼音 首字母 过滤 <br /> <br />在combobox中输入汉字拼音的首字母时，下面列出对应的可选项，就像下面这样<br /> <br /> <br /><br /> <br />1。 首先在数据库中需要设计一个表，专门用来存放药物及对应的拼音首字母，这样当用户输入拼音字母后就可以到表中查找匹配的药物，然后再显示<br /> <br />2。 下面的委托方法负责将从数据库获得的查询结果集重新邦定到combobox并自动弹出下拉列表。下面的代码需要注意这几行<br /]]></description><category></category></item><item><title><![CDATA[如何对界面进行单元测试]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/6074739</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/6074739</guid><author>rabbitlzx</author><pubDate>Tue, 14 Dec 2010 10:16:00 +0800</pubDate><description><![CDATA[关键字： Unit Test, UI, NunitForms工具： NUnitForms使用简介：1. 下载NUnitForms后安装，然后还要安装NUnit2. 新建一个winform程序，在界面上加一个button和两个textbox，然后在不button1的click事件private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "t1";
            tex]]></description><category></category></item><item><title><![CDATA[一些关于MVP的资料]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/6020943</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/6020943</guid><author>rabbitlzx</author><pubDate>Fri, 19 Nov 2010 10:55:00 +0800</pubDate><description><![CDATA[Selecting a MVC/MVP 
Implementation for a Winforms Project]]></description><category></category></item><item><title><![CDATA[SqlConnection.Open 在数据库断开连接时为何没有异常]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/6020929</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/6020929</guid><author>rabbitlzx</author><pubDate>Fri, 19 Nov 2010 10:50:00 +0800</pubDate><description><![CDATA[<br />这几天遇到的问题，就是发现，sqlconnection.open在数据库已经断开连接（如停掉sql service）时还能正常返回，没有错误发生，经过研究发现这是因为ado.net默认采取了连接池技术，当断开连接后，sqlconnection.open仍然可以从池中返回conn，但是已经是无效的，但是只有当你使用它的时候才会知道它是无效的，sqlconnection.open会到连接池中查看是否有对应的连接，有的话就拿出来，没有才会创建，当数据库断开后，在程序中调用sqlconnection.o]]></description><category></category></item><item><title><![CDATA[SqlConnection.Open在数据库断开时仍可以正常返回]]></title><link>https://blog.youkuaiyun.com/rabbitlzx/article/details/6013917</link><guid>https://blog.youkuaiyun.com/rabbitlzx/article/details/6013917</guid><author>rabbitlzx</author><pubDate>Wed, 17 Nov 2010 09:24:00 +0800</pubDate><description><![CDATA[一些相关资料：SQL Server Connection Pooling (ADO.NET)http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx Using Connection Pooling with SQL Server  Visual Studio 2005Other Versions .NET Framework 4Visual Studio 2008.NET Framework 1.1Connecting to a database serv]]></description><category></category></item></channel></rss>