進程:進程是一個程式在電腦運行時,全部資源的合集叫進程 線程:是程式的最小執行單位,包含計算資源,任何一個操作的響應都是線程完成的。 多線程:多個線程併發執行 Thread 是.net框架封裝的一個類,描述線程的東西 同步和非同步都是描述方法的,所以需要使用委托。 同步方法:發起一個調用,一定等著計算 ...
進程:進程是一個程式在電腦運行時,全部資源的合集叫進程 線程:是程式的最小執行單位,包含計算資源,任何一個操作的響應都是線程完成的。 多線程:多個線程併發執行 Thread 是.net框架封裝的一個類,描述線程的東西 同步和非同步都是描述方法的,所以需要使用委托。 同步方法:發起一個調用,一定等著計算結束才運行下一行。 非同步方法:發起一個調用,並不等計算結束,而是直接運行下一行,剛纔的計算,會啟動一個新的線程去執行 用委托的BeginInvoke()方法 BeginInvoke裡面三個參數(第一個參數是傳入值,回調函數,操作標識) 舉例說明 同步方法:請客吃飯,一定等客人到了才吃飯 非同步方法:請客吃飯,邊吃 邊等 非同步多線程: 多線程說的是CLR線程, 非同步是IO線程 多線程調試不要用斷點調試,因為每次都是不同的線程,多線程推薦用日誌,或者列印控制台 同步和非同步的區別: 1.同步方法卡頁面,因為UI線程忙於計算,非同步多線程方法不卡界面,主線程閑置,計算任務交給子線程在做。 2.同步方法慢,只有一個線程計算,非同步多線程方法快,多個線程併發計算,多線程的資源消耗更多,線程並不是越多越好 (資源有限,管理線程也消耗資源) 3、非同步多線程是無序的,啟動無序,執行時間不確定,結果無序。所以不要試圖通過啟動順序,或者時間等待來控制流程 回調函數:用於多線程完成之後執行的方法 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("上傳完成");