建立線程的經常使用方法:異步委託、定時器、Thread類編程
理解程序、進程、線程三者之間的區別:簡而言之,一個程序至少有一個進程,一個進程至少有一個線程
進程就是在內存中運行的程序(即運行着的程序);一個程序通常只有一個進程,一個進程能夠包含多個線程(多線程編程);數組
委託本質是類,查看生產的微軟中間代碼便可知道,該類中包含 BeginInvoke和EndInvoke方法多線程
.class public auto ansi sealed Core.MyFirstDelege extends [mscorlib]System.MulticastDelegate { // Methods .method public hidebysig specialname rtspecialname instance void .ctor ( object 'object', native int 'method' ) runtime managed { } // end of method MyFirstDelege::.ctor .method public hidebysig newslot virtual instance object Invoke ( object o ) runtime managed { } // end of method MyFirstDelege::Invoke .method public hidebysig newslot virtual instance class [mscorlib]System.IAsyncResult BeginInvoke ( object o, class [mscorlib]System.AsyncCallback callback, object 'object' ) runtime managed { } // end of method MyFirstDelege::BeginInvoke .method public hidebysig newslot virtual instance object EndInvoke ( class [mscorlib]System.IAsyncResult result ) runtime managed { } // end of method MyFirstDelege::EndInvoke } // end of class Core.MyFirstDelege
使用異步編程的簡單機制一:異步委託
委託類型的BeginInvoke和EndInvoke方法。
BeginInvoke方法:
參數組成:引用方法的參數列表+callback參數+state參數
返回值:IAsyncResult接口類型(接口介紹:這個接口有兩個重要屬性:IsCompleted屬性 bool類型 表示異步線程(方法)是否執行完成;
AsyncResult類實現了IAsyncResult,它有一個重要的成員:AsyncDeleget 返回被調用的委託的引用)異步
IAsyncResult類型的方法:.AsyncWaitHandle.WaitOne(50,false) 指定時間間隔內異步方法還沒運行完畢 返回false 不然返回true
方法被調用時作了哪些事:
1.在線程池中獲取一個線程,當這個線程被調度時,執行委託列表方法;
2.返回給主線程一個IAsyncResult對象的引用;
EndInvoke方法:
參數組成:IAsyncResult類型
返回值:被調用的委託的返回值類型
方法被調用時作了哪些事:
根據參數:IAsyncResult對象找到關聯的線程,
若是這個線程已經執行完畢,EedInvoke作以下有些事:清理線程的狀態和資源;找到引用方法的返回值,並把它做爲本身的返回值返回。
若是這個線程沒有執行完畢,調用線程就會中止並等待,知道清理完成並返回值。
異步編程的三者模式:等待直到完成模式、輪詢模式、回調模式.
下面給個回調模式的列子:
public class TestThreading
{
public static int Method(int n, int m)
{
Console.WriteLine("異步方法內部開始");
System.Threading.Thread.Sleep(5000);
return n > m ? n : m;
}
public static void CallBack(IAsyncResult ia)
{
AsyncResult ar = (AsyncResult)ia;
MyDel del = (MyDel)ar.AsyncDelegate;
int result = del.EndInvoke(ia);
Console.WriteLine(result);
}
}
static void Main(string[] args)
{
#region 異步編程與線程
Console.WriteLine("Main中的處理代碼。。。。。");
MyDel del = new MyDel(TestThreading.Method);
Console.WriteLine("BeginInvoke 方法調用以前");
IAsyncResult ia = del.BeginInvoke(32, 100, TestThreading.CallBack, null);
Console.WriteLine("BeginInvoke調用以後,Main繼續作別的事情");
System.Threading.Thread.Sleep(5000);
Console.WriteLine("Main 程序結束");
#endregion
}
使用異步編程的簡單機制二:計時器
.Net BCL 提供了好幾個Timer類,在這裏我只介紹System.Threading中的Timer
首先看下Timer最經常使用的構造函數:
Timer(TimerCallback callback,objec state,int dueTime,int period)
下面分別介紹下各個參數,介紹完了你就會用Timer實現異步編程了:
TimerCallback 是一個委託類型,定義以下 void TimerCallback(object state) 這個就是回調函數,計時器在每次時間到時執行回調方法
state 就是要傳給回調方法的參數
dueTime 就是回調方法在第一次被執行以前的時間
period 是兩次調用回調方法之間的時間間隔
Demo以下:
public class TestTimer
{
public static void TimerCallBack(object o)
{
Console.WriteLine("{0},{1}",o,DateTime.Now.ToString("yy:MM:dd HH:mm:ss"));
}
}
static void Main(string[] args)
{
#region Timer類的使用(System.Threading下的)使用Timer發異步(回調函數)
Timer time = new Timer(TestTimer.TimerCallBack, "lxf", 5000, 1000);
#endregion
}
ide