网站首页 > 技术文章 正文
进程:进程是一个程序在电脑运行时,全部资源的合集叫进程
线程:是程序的最小执行单位,包含计算资源,任何一个操作的响应都是线程完成的。
多线程:多个线程并发执行
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("上传完成");
- 上一篇: C# 跨线程调用控件(c#夸线程访问控件)
- 下一篇: PLC工程师学会编程,是一种什么样的体验?
猜你喜欢
- 2024-10-25 优秀后端都应该具备哪些开发好习惯
- 2024-10-25 分享50个让你代码更好的小建议(好用的代码)
- 2024-10-25 Spring AOP里的静态代理和动态代理,你真的了解吗?
- 2024-10-25 代码保护软件 VMProtect 用户手册之准备项目: 使用标记
- 2024-10-25 写代码有这些想法,同事才不会认为你是复制粘贴程序员
- 2024-10-25 用Java创建对象的5种不同方法(java创建对象的几种方式)
- 2024-10-25 DispatcherObject(dispatchertimer)
- 2024-10-25 WPF效果第二百一十篇之NPOI插入图片
- 2024-10-25 【译】ConfigureAwait FAQ(configgenerator翻译)
- 2024-10-25 C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)