摘要:
一、异步接口的声明 我们已经了解到,如果一个方法是异步的,那么这个方法的返回值类型是Task<T>,那么接口中该如何规定异步方法呢? 一样的,如果接口中的方法是异步的,那么规定方法的返回值类型是Task<T>即可,看下面的代码: interface ITest { /// <summary> /// 阅读全文
摘要:
一、引言 我们先来看下面的一个小示例:一个Winfrom程序,界面上有一个按钮,有两个异步方法,点击按钮调用两个异步方法,弹出执行顺序,代码如下: using System; using System.Threading; using System.Threading.Tasks; using Sy 阅读全文
摘要:
一、引言 我们有时侯需要在程序里面调用Http接口、请求http资源、编写http爬虫等的时候都需要在程序里面进行Http请求。很多人习惯的WebClient、HttpWebRequest在TPL下有很多用起来不方便的地方,TPL下推荐使用HttpClient(using System.Net.Ht 阅读全文
摘要:
一、引言 .NET中很多的类、接口在设计的时候都考虑了多线程问题,简化了多线程程序的开发,不用自己去写WaitHandler等这些底层的代码,由于历史的发展,这些类的接口设计有着三种不同的风格:EAP、APM和TPL。目前重点用TPL。 二、EAP EAP是Event-based Asynchron 阅读全文
摘要:
一、引言 在前面的文章中,我们是使用“锁”的方式实现了线程间的通信,这种通信方式比较笨重。除了锁之外,.NET中还提供了一些线程间更自由通讯的工具,他们提供了通过“信号”进行通讯的机制,通俗的比喻为“开门”、“关门”:Set()开门、Reset()关门、WaitOne()等着。 二、WaitHand 阅读全文
摘要:
一、单例模式 我们先来看看两种创建单例模式的示例代码。 1、饿汉式 饿汉式创建单例模式是在程序里面直接初始化了一个对象实例: class Good { /// <summary> /// 私有的静态变量,直接初始化 /// </summary> private static Good Instanc 阅读全文
摘要:
一、前言 我们先来看下面一个例子: using System; using System.Threading; namespace ThreadSynchDemo { class Program { private static int Counter = 0; static void Main(s 阅读全文
摘要:
一、数组(Array) 数组具有以下的特点: 数组属于线性结构,在内存中是连续存放的。 数组的元素类型必须相同。 数组可以直接通过下标访问。 数组的查找速度非常快,新增和删除速度慢。 数组在初始化时要指定数组长度。 二、动态数组(ArrayList) 动态数组具有以下的特点: ArrayList的底 阅读全文
摘要:
一、前言 这个问题涉及了垃圾回收的内部机制,在通常情况下程序员并不需要去关心和干涉GC的内部执行,但是理解其算法,可以帮助程序员理解哪些代码是高效的,而哪些代码是需要避免的。 二、什么是代 GC在执行垃圾回收时,并不是每次都扫描托管堆内的所有对象实例,这样做太耗费时间而且也没有必要。简单来说,GC会 阅读全文
摘要:
一、前言 在C#中,由于有了垃圾回收机制的支持,对象的析构和以前的C++有了很大的不同,这就要求程序员在设计类型的时候,充分理解.NET的机制,明确怎样利用Dispose方法和Finalize方法来保证一个对象正确而高效地被析构。 二、Dispose方法的功能 我们在讲解有关using的用法时,已经 阅读全文