进程:进程是一个程序在电脑运行时,所有资源的合集叫进程
线程:是程序的最小执行单位,包含计算资源,任何一个操做的响应都是线程完成的。
多线程:多个线程并发执行
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("上传完成");