進程:進程是一個程序在電腦運行時,所有資源的合集叫進程
線程:是程序的最小執行單位,包含計算資源,任何一個操做的響應都是線程完成的。
多線程:多個線程併發執行
Thread 是.net框架封裝的一個類,描述線程的東西
同步和異步都是描述方法的,因此須要使用委託。
同步方法:發起一個調用,必定等着計算結束才運行下一行。
異步方法:發起一個調用,並不等計算結束,而是直接運行下一行,剛纔的計算,會啓動一個新的線程去執行
用委託的BeginInvoke()方法 BeginInvoke裏面三個參數(第一個參數是傳入值,回調函數,操做標識)
舉例說明
同步方法:請客吃飯,必定等客人到了才吃飯
異步方法:請客吃飯,邊吃 邊等
異步多線程: 多線程說的是CLR線程, 異步是IO線程
多線程調試不要用斷點調試,由於每次都是不一樣的線程,多線程推薦用日誌,或者打印控制檯
同步和異步的區別:
1.同步方法卡頁面,由於UI線程忙於計算,異步多線程方法不卡界面,主線程閒置,計算任務交給子線程在作。
2.同步方法慢,只有一個線程計算,異步多線程方法快,多個線程併發計算,多線程的資源消耗更多,線程並非越多越好
(資源有限,管理線程也消耗資源)
三、異步多線程是無序的,啓動無序,執行時間不肯定,結果無序。因此不要試圖經過啓動順序,或者時間等待來控制流程
回調函數:用於多線程完成以後執行的方法
AsyncCallback callback = ar=> ConSole.WriteLine("執行回調函數");
public delegate void AsyncCallback(IAsyncResult ar);回調函數是這個委託
案例:
/// <summary>
/// 耗時方法
/// </summary>
/// <param name="name"></param>
private void DoSomeThing(string name)
{
Console.WriteLine($"開始執行{name}, {Thread.CurrentThread.ManagedThreadId.ToString("00")} ,{DateTime.Now}");
int num = 1;
for (int i = 0; i < 100000000; i++)
{
num++;
}
Thread.Sleep(1000);
Console.WriteLine($"結束執行{name}, {Thread.CurrentThread.ManagedThreadId.ToString("00")} ,{DateTime.Now},{num}");
}
/// <summary>
/// 同步方法 按鈕
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
Action<string> act = this.DoSomeThing;
for (int i = 0; i < 5; i++)
{
act.Invoke("button1_Click");
}
Console.WriteLine("計算以後幹什麼");
}
/// <summary>
/// 異步方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
Action<string> act = this.DoSomeThing;
AsyncCallback asyncCallback = ar => Console.WriteLine("回調函數"); //回調函數
IAsyncResult result = null;
for (int i = 0; i < 5; i++)
{
result = act.BeginInvoke("button2_Click", asyncCallback, "小豬");
}
act.EndInvoke(result);
}
下面這個是作假的上傳等待操做
Action<string> atc = this.DoSomeThing; IAsyncResult iAsyncResult = atc.BeginInvoke("上傳文件", ar => Console.WriteLine("執行回調函數"), null); int i = 1; while (!iAsyncResult.IsCompleted) { if (i < 10) { Console.WriteLine($"文件上傳{i++ * 10}"); } else { Console.WriteLine($"已完成99%....立刻結束"); } Thread.Sleep(100); } Console.WriteLine("上傳完成");