21:23:23
之所以使用多线程...是以下几个原因..
或是叫做线程的用处..
1>多个线程同时执行..加快处理速度...比如100万数据...开10个线程...每线程处理10万数据...提高速度...
2>多个任务在相同程序中需要同时执行...比如你的一个程序..即要实时从网络上获取数据..又要将数据画在界面上...访问网络和UI..这是俩个任务...需要同时干活...
21:25:14
3>长时间执行的任务.需要使用线程...比如你需要从网络上下载一个文件..耗时半分钟...或是执行100万数据的统计...耗时20秒...这些个长时间执行不完的事儿...必须得使用后台线程..否则..你的UI将会在执行任务完以前不能任何操作...会假死..会让使用者误以为你的程序死机了...
21:26:39
4>阻塞式调用...必须单独使用线程...网络编程时..有一个接收函数..是阻塞式调用...即:当执行到接收函数时...会一直卡在这...直到网络上有数据来..接收缓冲区内存在数据后..才会再往下执行... 还是由于以上原因..你要不使用线程...则UI会假死...
21:26:56
我能想到的暂时这些....
21:27:04
上面说的是何时需要使用独立线程...
21:27:13
线程用在哪儿...
21:27:31
有很多人..乱用线程...线程并不是开得越多..执行越快...
21:27:41
好的我慢慢消化下 谢谢了 师傅
21:27:58
怎么才能合理用线程
21:27:58
任务量小的时候...10个线程的时间..还比不上一个线程...
21:29:53
线程越多..而CPU的处理能力却是一定的...
那么..CPU的处理时间...分到更多的线程...则每个线程的时间片就越小...
并且...线程在切换时..还是要消耗CPU的...
即...任务小的时候...线程上下文切换所带来的附加损耗..将大过你多个线程提高的那点速度...
21:30:23
所以按我上面说的四种使用线程就行..
21:30:31
嗯 好的
21:31:19
比如你访问一个WEB页..想用程序打开一个网页...(不是使用WEBBROWSER控件)...使用代码提取HTML...
21:32:08
你向服务器提交..到收到服务器响应...这个时间是不确定的...有可能马上就能收到响应...
也有可能网络慢...或是根本你要的页面不存在...
21:32:35
所以在你程序中..这种访问网络..或是其他执行时间未知的事情..都要使用线程去处理...
21:32:51
下一话题...
线程和异步...
21:32:57
嗯嗯
21:34:08
这俩都是使用另一个线程..去处理任务...
不同的是..
线程是基本上可以直接启动线程..直接执行...直到线程执行完...
异步...其实是基于回调的...你提出一个任务...任务完成后..回调通知...
21:34:15
机制是不一样的....
21:34:52
在C#中..
线程使用thread类定义...
异步...使用委托类型上的...beginxxx end xxx调用的...
21:35:20
你会发现C#编程中..有很多类型..里面包含begin xxx end XX的成对方法...
21:35:38
这些就是异步方法...可以直接调用这些方法让功能异步执行...
21:36:10
具体..怎么用..
百度.. C# thread
C# 异步
有很多实例 ....
21:36:18
代码例程自己找...
21:36:18
好的
21:36:31
听你一说 一下了解了精华
21:37:09
在C#中..
thread..线程...是直接当成独立线程执行的...
而异步调用的东西..是运行在线程池的...
21:37:38
相关内容..自行百度...
windows 线程池
C# 线程池
21:39:05
因为线程的创建销毁...都是要消耗CPU资源的..
所以WINDOWS上..有内建的一堆预置线程...这些线程可以重用...就相当于一批啥都能干的万能工...
有活来了..谁空闲..谁干活..活干完了..由异步机制回调通知主线程..我完成任务了...
21:39:18
这样可以减少CPU消耗...
21:39:41
详细百度..线程池相关内容...
21:40:47
那么什么时候使用真的线程THREAD..什么时候用异步线程池 ?
当你的程序是计算密集型的时候..比如统计...累加...这类纯计算类的操作...使用线程...thread.
21:41:41
当你的程序是操作密集型 的时候....比如.网络访问..打印机访问...磁盘访问...这些需要与硬件打交道..或是需要操作某外设的时候...使用异步..以减少不必要的CPU消耗...
21:42:07
听你一席话 提升几个档次
21:42:53
比如..还是上面的例子...
你访问一个页面...
如果使用thread..则在整个thread执行完成前..都是消耗CPU的...包括网络等待...
21:43:07
如果使用了异步...则在服务器有响应前...CPU空闲...
21:03:58
是根本不理解线程..还是不会在C#下使用线程..还是不会线程同步..还是什么...
21:04:04
总得说一个方面啊...
21:04:23
那么多内容...所有线程相关的全说完..得好久好久了....
21:04:43
哦
21:04:49
我还是搞个项目 再问你
21:04:52
不是我不想理你们....
21:05:21
是你们问的问题...
内容太过庞大...
说点皮毛..不顶用..
要是全说...那实在是内容太多...
21:05:29
所以还是得自己知道哪不会..再问...
21:05:30
嗯嗯 我们的错
21:05:47
是的 还是我们动机不纯
21:08:13
要不先给你上一课. ?
21:08:19
我不清楚你现在学到什么程度的.
21:08:44
你忙你的吧
21:08:49
你以前学过别的语言没..
21:08:49
我做个项目 不懂再来问你
21:08:53
除了C#还会别的不.
21:09:00
C#会到什么程度.
21:09:04
全忘记了 VB JAVA
21:09:18
好吧.
21:09:23
线程理解 不.
21:09:35
能写简单的
21:09:40
线程理解 不.
21:09:43
能
21:09:47
线程是干麻用的....
21:09:50
进程...
21:09:52
线程...
21:10:02
异步
21:10:10
异步还不一样...
21:10:17
委托
21:10:25
委托理解不..
21:10:52
能用 感觉没领会要领
21:11:00
你要是学了多种语言..
特别是会C/C++..可以进行类比..你一下就知道是怎么回事了....
21:11:11
委托其实就是C++中的函数指针.
21:11:18
好的谢谢了
21:11:21
先说C#
21:11:30
先会C#再学其它的
21:11:33
不然学乱了
21:11:39
C#是完全面向对象的语言...
C#中所有的东西都是对象...
21:11:51
不存在完全的..所谓全局变量...
21:12:03
你在C#中看到的所有的东西..全是对象..
21:12:05
看样子 你C C++ 也挺溜
21:12:17
而C++中..基本都是简单类型...
21:12:47
比如指针类型...基本上就是一个存地址的一个变量...本身不包括其他信息...
21:13:56
或者是类似C++中的数组...数组本质是一个指针...里面只有数据...但其不能自描述...
就是说..单靠着数组变量..你无法知道这个数组在定义时的边界..或是里面有多少数据...
21:14:18
而C#...里面所有皆对象...
C#中...数组有扩展方法...
21:14:44
列表LIST是最常用的..这其实是一个类...里面除了数组元素..还包含了数组本身的信息...
21:15:14
同样的...C#中没有指针类型...
所以..C++中的函数指针...在C#中..描述为委托类型...
21:15:19
委托..其实是一个类...
21:15:43
这是第一点要说的...
委托..其实是一个类.类型...
21:15:44
一下好清晰了
21:16:42
再继续说啊
21:17:04
委托既然是类...就像C#中其他类型一样..可以自描述...
当然..你很多时候并不需要关心这些...委托中..包括了函数指针...以及怎么调用..函数签名..这些....
21:18:05
函数指针.../ 委托....
其作用..就是在代码无法给出具体实现但却先知道函数签名的时候...用这个..
比如:
事件..
回调..
21:18:53
将一个符合委托类型签名的函数..赋给一个委托变量...
调用这个委托...和直接调用函数..是一样的...
21:19:14
下一点...讲一下...线程....
21:19:48
什么是进程...
进程是识别一个程序的最小单位...
一个程序执行..识别为一个进程...
21:20:00
而CPU执行的时候..识别的最小单位是线程...
21:20:14
CPU将多个时间片划给不同线程去执行..
21:20:53
线程是程序执行的最小基本单位...
一个进程..至少包括一个线程...
21:21:06
有2个线程以上的程序..就是多线程的.....
21:43:50
下一话题...
上面说过的委托...和这个线程和异步有啥关系....
21:44:34
委托..就是函数指针...本质作用..就是在调用函数时..除了知道函数名长啥样..别的都不知道...即...在调用函数前..函数还没定义..不知道具体实现....
21:45:00
那么...你在定义线程变量时...
所要传入的..就是一个委托....
21:45:07
这个委托..就是函数名...
21:45:22
就是线程在执行时..所要调用的那个函数代码.
21:46:03
而在异步相关内容上...
上面说的都是C#中现成的控件..自带的BEGIN/END对...实现 异步...
21:46:18
如果你自己定义了一个纯函数...想异步怎么办 ?
21:46:45
定义一个符合函数签名的委托...
将这个函数传给委托...
委托本质是一个类...
这个类..就支持异步...
21:46:59
所以..你可以在委托变量上..执行 begin/end
21:47:13
这样..你自己的函数..就按异步调用....
21:47:45
具体百度
委托 异步
线程 委托
21:48:07
下一话题...
C#中使用的几种方式....
21:48:33
1>上面说过的...thread.类..这个最简单...定义线程变量..传入要执行的函数...
21:48:57
2.异步...上面也说过了..就是使用begin/end方法对...
21:50:20
3>在.NET4以上的版本中...有一批新的方法以方便多线程编程...传统方法..你在线程中执行时...如果想中途中断..你得自己写中断机制....NET4中有一个任务类...有一套完整的线程取消机制....
21:50:37
.NET4以上...有一个类...类名就是 TASK...任务...
21:50:47
使用上更方便....
21:51:40
其实C#中是有一个专门的线程池编程的...那涉及的类比较多..写出来的代码也麻烦...
而TASK..执行的代码...就是运行在线程池中的...并且支持任务取消模型..
21:51:55
具体百度..
C# task
22:13:09
如果只是显示...则使用begininvoke..
22:14:11
例如..实时的想显示处理的进度..显示进度条...
实时的更新界面上的数据...
只显示..不回读...
显示不显示..并不会影响后续代码的执行...
这时使用begininvoke..把要显示的内容扔给UI线程后就不管了...
22:14:35
这样可以加快执行...
要不然..UI显示时所消耗的时间..会累加到后台线程上...
22:15:03
下一话题...
22:15:07
22:15:23
上面说过...一般的线程应用..主要就是为了防止界面被卡死...
22:16:14
现在知道原因了吧..
因为你在UI上执行长时间的操作...或是阻塞调用...
则UI线程会长时间卡住...导致消息循环.不能继续...
消息循环卡住的最明显特征...就是界面无响应....
22:16:31
界面无响应..点不动了...
哪都没反应....
22:17:01
所以在编程时..
处理时间太大的...都要使用线程或是异步..脱离开UI线程执行...
22:17:48
豁然开朗
22:18:26
定义线程类...
传入执行函数..
启动线程后立即返回...
主界面还是会继续执行...
干活的线程在后台...
线程执行完成后...使用异步..或是回调..或是使用控件的INVOKE..将结果再通知回UI线程或是调用的父线程.
22:13:09
如果只是显示...则使用begininvoke..
22:14:11
例如..实时的想显示处理的进度..显示进度条...
实时的更新界面上的数据...
只显示..不回读...
显示不显示..并不会影响后续代码的执行...
这时使用begininvoke..把要显示的内容扔给UI线程后就不管了...
22:14:35
这样可以加快执行...
要不然..UI显示时所消耗的时间..会累加到后台线程上...
22:15:03
下一话题...
22:15:07
双击查看原图
22:15:23
上面说过...一般的线程应用..主要就是为了防止界面被卡死...
22:16:14
现在知道原因了吧..
因为你在UI上执行长时间的操作...或是阻塞调用...
则UI线程会长时间卡住...导致消息循环.不能继续...
消息循环卡住的最明显特征...就是界面无响应....
22:16:31
界面无响应..点不动了...
哪都没反应....
22:17:01
所以在编程时..
处理时间太大的...都要使用线程或是异步..脱离开UI线程执行...
22:17:48
豁然开朗
22:18:26
定义线程类...
传入执行函数..
启动线程后立即返回...
主界面还是会继续执行...
干活的线程在后台...
线程执行完成后...使用异步..或是回调..或是使用控件的INVOKE..将结果再通知回UI线程或是调用的父线程.
浙公网安备 33010602011771号