优秀的编程知识分享平台

网站首页 > 技术文章 正文

异步多线程 Async(异步多线程与同步多线程)

nanyue 2024-10-25 13:18:52 技术文章 3 ℃

进程:进程是一个程序在电脑运行时,全部资源的合集叫进程


线程:是程序的最小执行单位,包含计算资源,任何一个操作的响应都是线程完成的。


多线程:多个线程并发执行


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(#34;开始执行{name}, {Thread.CurrentThread.ManagedThreadId.ToString("00")} ,{DateTime.Now}");

int num = 1;


for (int i = 0; i < 100000000; i++)

{

num++;

}

Thread.Sleep(1000);


Console.WriteLine(#34;结束执行{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(#34;文件上传{i++ * 10}");

}

else

{

Console.WriteLine(#34;已完成99%....马上结束");

}

Thread.Sleep(100);

}

Console.WriteLine("上传完成");

Tags:

最近发表
标签列表