异步多线程 Async
程序员文章站
2022-12-14 22:26:14
进程:进程是一个程序在电脑运行时,全部资源的合集叫进程 线程:是程序的最小执行单位,包含计算资源,任何一个操作的响应都是线程完成的。 多线程:多个线程并发执行 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>
/// <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>
/// <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);
/// 异步方法
/// </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("上传完成");
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("上传完成");
上一篇: C#使用log4net记录日志
下一篇: 人的耐寒是不一样的