標籤:使用 os io 代碼 re line
理解程式、進程、線程三者之間的區別:簡而言之,一個程式至少有一個進程,一個進程至少有一個線程
進程就是在記憶體中啟動並執行程式(即運行著的程式);一個進程一般只有一個線程,一個進程可以包含多個線程(多線程編程);
使用非同步編程的簡單機制一:非同步委託
委託類型的BeginInvoke和EndInvoke方法。
BeginInvoke方法:
參數組成:引用方法的參數列表+callback參數+state參數
傳回值:IAsyncResult介面類型(介面介紹:這個介面有兩個重要屬性:IsCompleted屬性 bool類型 表示非同步線程(方法)是否執行完成;AsyncState。
這個介面是AsyncResult類的一個成員,這個類還有一個重要的成員:AsyncDeleget 返回被調用的委託的引用)
方法被調用時做了哪些事:
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
}