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#多线程随记回顾的更多相关文章

  1. asp.net请求响应模型原理随记回顾

    asp.net请求响应模型原理随记回顾: 根据一崇敬的讲师总结:(会存在些错误,大家可以做参考) 1.-当在浏览器输入url后,客户端会将请求根据http协议封装成为http请求报文.并通过主sock ...

  2. 用gdb调试python多线程代码-记一次死锁的发现

    | 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 前言 相信很多人都有 ...

  3. iis处理请求随记回顾

    ----http是无状态的, 每次http请求户不影响,都是独立的:不会记的上次请求: -------iis原理:输入地址--socket封装请求体报文--发送---iis解析封装响应体---返回: ...

  4. C# socket通信随记回顾

    ----tcp(传输 控制 协议)是可靠消息:三次握手(发给对方,对方发给自己,证明对方接到消息,在发给对方,说明自己能接到对方消息,这样就都知道了):tcp:每发送一次消息,对方都会回复,证明接受到 ...

  5. Java基础知识回顾

    Java回顾之I/O Java回顾之网络通信 Java回顾之多线程 Java回顾之多线程同步 Java回顾之集合 Java回顾之序列化 Java回顾之反射 Java回顾之一些基础概念 Java回顾之J ...

  6. python爬虫入门(四)利用多线程爬虫

    多线程爬虫 先回顾前面学过的一些知识 1.一个cpu一次只能执行一个任务,多个cpu同时可以执行多个任务2.一个cpu一次只能执行一个进程,其它进程处于非运行状态3.进程里包含的执行单元叫线程,一个进 ...

  7. Object-Oriented Programming Summary Ⅱ

    电梯作业总结博客 17373492 电梯,多线程学习中的 "HelloWorld",早在大一就有所耳闻,以至于在坐电梯的时候就思考过:电梯需要怎么写呢? 0. 前言: 偶然的机会, ...

  8. Java多线程与并发库高级应用-传统线程机制回顾

    1.传统线程机制的回顾 1.1创建线程的两种传统方式 在Thread子类覆盖的run方法中编写运行代码 // 1.使用子类,把代码放到子类的run()中运行 Thread thread = new T ...

  9. Java基础知识回顾之五 ----- 多线程

    前言 在上一篇文章中,回顾了Java的集合.而在本篇文章中主要介绍多线程的相关知识.主要介绍的知识点为线程的介绍.多线程的使用.以及在多线程中使用的一些方法. 线程和进程 线程 表示进程中负责程序执行 ...

随机推荐

  1. debian(wheezy) chrome beta 38.0.2x.xxx Shockwave Flash was crashed 该解决方案崩溃.

    版本号chrome beta升级到38.0.2x.xxx什么时候, flash他挂了. 调试 ./libpepflashplayer.so: /lib/x86_64-linux-gnu/libc.so ...

  2. $.ajax()详解

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  3. C# .net基于Http实现web server(web服务)

    原文:C# .net基于Http实现web server(web服务) 什么是 web server?  百度百科是这么解释的: Web Server中文名称叫网页服务器或web服务器.WEB服务器也 ...

  4. 正则获取URL参数

    一 获取指定URL参数 function getUrlParams(name) { var reg = new RegExp("(^|&)" + name + " ...

  5. Python - 缩写(capwords) 和 创建转换表(maketrans) 详细说明

    缩写(capwords) 和 创建转换表(maketrans) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27051 ...

  6. JMeter怎么使用代理服务器

    一.JMeter有一个内置的代理服务器,主要用户使用浏览器录制脚本,在左侧的WorkBench中添加HTTP Proxy Server即可, 其中port表示代理服务器段口号, URL Pattern ...

  7. hdu Oulipo(kmp)

    Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, w ...

  8. N-gram统计语言模型(总结)

    N-gram统计语言模型 1.统计语言模型 自然语言从它产生開始,逐渐演变成一种上下文相关的信息表达和传递的方式.因此让计算机处理自然语言.一个主要的问题就是为自然语言这样的上下文相关特性建立数学模型 ...

  9. .NET中lock的使用方法及注意事项

    lock就是把一段代码定义为临界区,所谓临界区就是同一时刻只能有一个线程来操作临界区的代码,当一个线程位于代码的临界区时,另一个线程不能进入临界区,如果试图进入临界区,则只能一直等待(即被阻止),直到 ...

  10. Sql数据类型转换

     一.ASCII码值与字符间转换 1.ASCII()与CHAR()       ASCII()返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用''括起来,但含其 ...