c#多线程随记回顾
C#多线程随记回顾
1.创建多线程方式知道的有三种:
---手动创建Thread、使用线程池、使用task任务
---手动创建Thread,分两种带参数和不带参数的帮助委托器
eg: //帮助器委托不带参数
// ThreadStart ts = new ThreadStart(DoWork)
// for (int i = 1; i <= 3; i++)
// {
// Thread t = new Thread(ts);
// t.Name = "线程"+i.ToString() ;
// t.Start();
// }
// Console.Read();
eg://帮助器委托带参数
ParameterizedThreadStart ts = new ParameterizedThreadStart(DoWork);
for (int i = 1; i <= 3; i++)
{
Thread t = new Thread(ts);
t.Name = "线程" + i.ToString();
t.Start(5); }
Console.Read();
-------回调方法:
//委托
f = new FDeletate(Fibonacci);
AsyncCallback callback = new AsyncCallback(Display);//回调委托
int n = Convert.ToInt32(Console.ReadLine());
f.BeginInvoke(n, callback,"ggds");
Console.ReadLine();
--回调方法; = f.EndInvoke(r);将结果返回
static void Display(IAsyncResult r)
{
int result = f.EndInvoke(r);
Console.WriteLine("第"+r.AsyncState+"项值是"+result);
Console.Read();
}
-----------补充线程:
----线程是windows任务调度最小的单位,线程是程序的一个执行流;
cpu切换的不是进程而是线程。进程占用资源太多;
--单核cpu一个时间只有一个线程;一个exe就是一个进程;
一个线程对应一个寄存器;
--Process.Start("");
---一个应用程序与只能承载一个exe,可承载多个dll;
---一个进程可以有多个应用程序域;
--一个线程可穿透多个应用程序与,
同一时间一个线程指正属于一个应用程序域;
一个应用程序与可以跑多个线程;
==一个应用程序与有一个上下文;
----当前线程:
Thread t = Thread.CurrentThread;
t.name;
-----
//后台线程;
t.IsBackground = true;
--thrad线程是clr线程和操作系统线程是不一样的;之间是映射关系;
线程终止:Thread.abort();
前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都
---会自动结束。
---默认为前台线程,thread.isbackground=false;
--线程优先级:AboveNormal;
//默认优先级:为AboveNormal;
Thread t = Thread.CurrentThread;
t.Priority = ThreadPriority.AboveNormal;
-----初始化一个线程:需要1M内存;
委托穿多个参数时,可以用list<object>
------windows窗体跨线程调用时,控制不能跨线程需要设置:
Control.checkForIllegalcrossThreadcalls=false;不检查,则能跨线程
-----lamed:
匿名函数:Cal是委托;
Cal c = new Cal((a, b) => { return a + b; });
如果没有参数:
Cal c = new Cal(() => { return 123; });
Cal c = new Cal((a, b) => { return a + b; });
IAsyncResult result = c.BeginInvoke(1, 2, null, null);
//阻塞线程;
int cc = c.EndInvoke(result);
Console.WriteLine(cc);
Console.Read();
----cc为返回结果;
------------------------------------第二种通过线程池来创建:
----------lock锁:lock内的变量是引用类型;操作公共资源时只让一个线程来操作,进行线程隔离和线程的同步(无论哪个线程访问都是的结果,比如+1操作);比如一个数组,否则会出
现超出索引;
lock()--:其实内部为monitor
{
}
---创建一个实例,会在一个应用程序域创建(类空间、同步索引快(默认为-1,类型指针(指向该实例的类型));
提到对象池,就应该想到lock;
---以后调用线程的时候就用线程池;guo方法是object类型;这样比穿件Thread简单多了;
//线程池:ThreadPool.QueueUserWorkItem(new WaitCallbac(guo), "");
---线程池原理,将任务加载到队列排队,在进入到本地队列让cpu执行;
{
ThreadPool.QueueUserWorkItem(new WaitCallback(guo), "");
Console.Write("主线程");
Console.Read();
}
public static void guo(object i)
{
Thread.Sleep(3000);
Console.WriteLine("sfsdf");
}
---死锁:相互等待对方释放资源;
---委托如果是无参,有返回值,那么匿名函数,应该为 ()=>{};;
--------3.使用task任务;
Task<string> ta = new Task<string>(() => {
System.Threading.Thread.Sleep(2000);
Console.WriteLine("sfsf");
return "";
});
ta.Start();
Console.Write("主线程");
Console.Read();
--
--task任务,可以使用 ta.Wait();来阻塞主线程,让子线程执行完,在执行;
--Thread t = new Thread(() => { });
t.Join();//相当于ta.Wait();
c#多线程随记回顾的更多相关文章
- asp.net请求响应模型原理随记回顾
asp.net请求响应模型原理随记回顾: 根据一崇敬的讲师总结:(会存在些错误,大家可以做参考) 1.-当在浏览器输入url后,客户端会将请求根据http协议封装成为http请求报文.并通过主sock ...
- 用gdb调试python多线程代码-记一次死锁的发现
| 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 前言 相信很多人都有 ...
- iis处理请求随记回顾
----http是无状态的, 每次http请求户不影响,都是独立的:不会记的上次请求: -------iis原理:输入地址--socket封装请求体报文--发送---iis解析封装响应体---返回: ...
- C# socket通信随记回顾
----tcp(传输 控制 协议)是可靠消息:三次握手(发给对方,对方发给自己,证明对方接到消息,在发给对方,说明自己能接到对方消息,这样就都知道了):tcp:每发送一次消息,对方都会回复,证明接受到 ...
- Java基础知识回顾
Java回顾之I/O Java回顾之网络通信 Java回顾之多线程 Java回顾之多线程同步 Java回顾之集合 Java回顾之序列化 Java回顾之反射 Java回顾之一些基础概念 Java回顾之J ...
- python爬虫入门(四)利用多线程爬虫
多线程爬虫 先回顾前面学过的一些知识 1.一个cpu一次只能执行一个任务,多个cpu同时可以执行多个任务2.一个cpu一次只能执行一个进程,其它进程处于非运行状态3.进程里包含的执行单元叫线程,一个进 ...
- Object-Oriented Programming Summary Ⅱ
电梯作业总结博客 17373492 电梯,多线程学习中的 "HelloWorld",早在大一就有所耳闻,以至于在坐电梯的时候就思考过:电梯需要怎么写呢? 0. 前言: 偶然的机会, ...
- Java多线程与并发库高级应用-传统线程机制回顾
1.传统线程机制的回顾 1.1创建线程的两种传统方式 在Thread子类覆盖的run方法中编写运行代码 // 1.使用子类,把代码放到子类的run()中运行 Thread thread = new T ...
- Java基础知识回顾之五 ----- 多线程
前言 在上一篇文章中,回顾了Java的集合.而在本篇文章中主要介绍多线程的相关知识.主要介绍的知识点为线程的介绍.多线程的使用.以及在多线程中使用的一些方法. 线程和进程 线程 表示进程中负责程序执行 ...
随机推荐
- javaScript在私有的属性和方法
javaScript并没有什么特别的语法来代表私人.保.或公共的属性和方法,在这一点上与 java或其他语言是不同的.JavaScript大家是共同的所有对象: var myobj={ mypop:1 ...
- php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz)
原文:php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz) 折腾了两天,dwz删除后,数据不能自动刷新,解决方案,直接看图 . 1. 删除.修改状态后无法刷新记录: 在dwz. ...
- asp.net学习之数据绑定控件、数据源控件概述
原文:asp.net学习之数据绑定控件.数据源控件概述 1.asp.net数据绑定控件分为三大类,每个类分别进行详细: ● 列表式数据绑定控件: 列表式数据绑定控件常用来在一个表格内的一个字 ...
- SQL Prompt5 破解版+使用说明 [转]
SQL脚本越写越多,总是觉得编写效率太过于低下,这和打字速度无关.在我个人编写SQL脚本时,至少会把SQL的格式排列成易于阅读的,因为其他人会阅读到你的SQL,无论是在程序中或是脚本文件中,良好的排版 ...
- Struts1——离BeanUtils看struts其原理1
在Struts中非常典型的特点就是使用了ActionForm来搜集表单数据,可是搜集到的表单数据所有都是String类型的.假设我们直接拿来使用我们会面临一个非常麻烦的问题就是频繁的类型装换. Str ...
- elasticsearch的rest搜索--- 总述
目录: 一.针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0 三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 一.针对这次装B 的解释 因为现在又 ...
- 使用excel微调button调整日期
笔者:iamlaosong excel提供了一个调整的数字button.用来调节单元格增加或减少数量.因为它需要值是0-30000.所以不能直接用其调节日期.但能够使用"初始日期+调节值&q ...
- 前端学习笔记(zepto或jquery)——对li标签的相关操作(三)
对li标签的相关操作——八种方式遍历li标签并获取其值 $("ul>li").forEach(function(item,index){ alert(index+" ...
- opengl微开发之1-从零開始
对OpenGL有一点了解之后,如今開始真正编写代码. 今天的内容: 使用FreeGLUT创建OpenGL的上下文环境 初始化GLEW 创建一个OpenGL的的模板范例 第一步: 一个OpenGL的上下 ...
- vS2010 列表控件 加入右键菜单
1.首先,就需要信息加入权限控制,例如,下面的对话框弹出 2,例如以下图选择须要的消息响应,这里选择NM_RCLICK 消息. 3,加入例如以下代码 </pre><pre name= ...