C#进阶(多线程相干)

打印 上一主题 下一主题

主题 1009|帖子 1009|积分 3027

1。进程?

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,【是系统进行资源分配的根本单位】,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的根本实行实体;在今世面向线程设计的计算机结构中,【进程是线程的容器】。程序是指令、数据及其组织情势的描述,进程是程序的实体。
概括:

进程是程序运行的环境。进程是线程的容器。一个进程可以包含多个线程。
进程是系统进行资源分配的根本单位,而线程是系统进行资源分配的最小单位(线程不能再分)。
A。Thread多线程对象:

实例化:Thread t1 = new Thread(两种委托),没有参数委托;带通报参数委托
多线程管理(被开发者诟病)
启动:t1.Start(向线程通报的数据)
中止:t1.Abort()
挂起:t1.Suspend()
重启:t1.Resume()
多线程的状态: UnStarted未启动, Running运行中, Suspended已挂起, Aborted已中止, Stoped已制止, …
多线程等候: t1.Join(毫秒数), Thread.Sleep(毫秒数)
B。Thread重要属性:

IsAlive 线程状态是否是存活。true存活
IsBackground 是否是配景线程。true配景
ThreadState 线程状态,比IsAlive范围大。
CurrentThread 当前实行的线程。
Name 线程名称
Priority 线程优先级
C。Thread重要方法:

new Thread(两种委托) 构造函数 ThreadStart和ParameterizedThreadStart
t.Start()启动
t.Abord()中止
t.Suspend()挂起
t.Resume()重新开始
t.Join(毫秒数)线程停止前,克制调用线程
Thread.Sleep(毫秒数)线程休眠,延迟
Thread线程类缺点是欠好用(欠好控制),如果创建多个线程时,更欠好管理。ThreadPool比Thread好一些,但也好不到那去。
线程锁:相对复杂
下载技术:HttpWebRequest(旧) WebRequest(旧), HttpClient(新),WebClient(新)。
窗体设计

  1. Thread thread1 = null;
  2. //启动
  3. private void button3_Click(object sender, EventArgs e)
  4. {
  5.     thread1 = new Thread(() =>
  6.     {
  7.         long n = Fibonacci(40);
  8.         Console.WriteLine(n);
  9.         Console.WriteLine("一个线程");
  10.         Invoke(new Action(() => label1.Text = n.ToString()));
  11.     });            
  12.     Console.WriteLine("启动");
  13.     Console.WriteLine(thread1.ThreadState);
  14.     thread1.Start();
  15.     Console.WriteLine(thread1.ThreadState);
  16. }
  17. //暂停
  18. private void button6_Click(object sender, EventArgs e)
  19. {
  20.     Console.WriteLine("暂停");
  21.     Console.WriteLine(thread1.ThreadState);
  22.     thread1?.Suspend();
  23.     Console.WriteLine(thread1.ThreadState);
  24. }
  25. //重启
  26. private void button5_Click(object sender, EventArgs e)
  27. {
  28.     Console.WriteLine("重启");
  29.     Console.WriteLine(thread1.ThreadState);
  30.     thread1?.Resume();
  31.     Console.WriteLine(thread1.ThreadState);
  32. }
  33. //停止
  34. private void button4_Click(object sender, EventArgs e)
  35. {
  36.     Console.WriteLine("停止");
  37.     thread1.Abort();
  38. }
  39. //裴波那契数列
  40. public static long Fibonacci(int n)
  41. {
  42.     if (n < 0)
  43.         throw new ArgumentOutOfRangeException(nameof(n), "参数必须为非负整数");
  44.     // 基准情况
  45.     if (n == 0) return 0;
  46.     if (n == 1) return 1;
  47.     // 纯递归调用
  48.     return Fibonacci(n - 1) + Fibonacci(n - 2);
  49. }  
复制代码
依次点击输出效果

2。线程?

线程(英语:Thread)是操作系统能够进行 【运算调度的最小单位】 。它被包含在进程之中,是进程中的实际运作单位。【一条线程指的是进程中一个单一顺序的控制流】,一个进程中可以并发多个线程,每条线程并行实行不同的使命。
概括:

线程是操作系统资源调度的最小单位。线程不能独立运行,必须包含在进程中。进程中可以包含多个线程。多线程实行时是并行(异步),无序的。
串行===>列队===>阻塞(同步) 并行===>无序===>非阻塞(异步)
线程之间要通讯。会有两种方案:同步和异步。
单个线程中能不能异步?可以
【多线程肯定是异步。异步不肯定是多线程。】
多线程中有N个线程,但主线程只有一个,其他的线程都称为分线程。对于单线程程序来说,程序中只有一个线程,这个线程就是主线程。
3。多线程概念?优点及缺点?

多线程是指程序中包含多个实行流(线程),即在一个程序中可以同时运行多个不同的线程来实行不同的使命,也就是说允许单个程序创建多个并行实行的线程来完成各自的使命。
概括:

多线程让程序同时运行多个线程,多个线程并行实行(实行时无顺序)
优点:

可以进步CPU的利用率。大大进步了程序的运行效率,用户体现好,粘性高。
缺点:

a.线程也是程序,以是线程运行必要占用计算机资源,线程越多占用资源也越多。(占内存多)
b.多线程必要和谐和管理,以是必要CPU跟踪线程,消耗CPU资源。(占cpu多)
c.线程之间对共享资源的访问会相互影响,必须办理竞用共享资源的题目。(多线程存在资源共享题目 锁)
d.线程太多会导致控制太复杂,终极大概造成很多Bug。(管理麻烦,轻易产生bug)
死锁:某个资源不能空闲。
4。线程池?

.NET Framework2.0期间,出现了一个线程池ThreadPool,是一种池化思想,如果必要利用线程,就可以直接到线程池中去获取直接利用,如果利用完毕,在自动的回放到线程池去;
C#锁保举
窗体设计

关键代码
  1. private void btnOn_Click(object sender, EventArgs e)
  2. {
  3.      //workerThreads,最大线程数。completionPortThreads,活动线程数。
  4.      ThreadPool.GetAvailableThreads(out int workerThreads, out int completionPortThreads);
  5.      Console.WriteLine(workerThreads);
  6.      Console.WriteLine(completionPortThreads);
  7.      Console.WriteLine("_____________________");
  8.      ThreadPool.GetMaxThreads(out int workerThreads1, out int completionPortThreads1);
  9.      Console.WriteLine(workerThreads1);
  10.      Console.WriteLine(completionPortThreads1);
  11.      Console.WriteLine("_____________________");
  12.      ThreadPool.GetMinThreads(out int workerThreads2, out int completionPortThreads2);
  13.      Console.WriteLine(workerThreads2);
  14.      Console.WriteLine(completionPortThreads2);
  15.      Console.WriteLine("_____________________");
  16.      //ThreadPool线程池,主要把比较耗时的任务放到一个队列中。开发者不用手动管理线程池中的线程。线程池会帮我们自动管理。
  17.      ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine(state); }, "abc1");
  18.      ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine(state); }, "abc2");
  19.      ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine(state); }, "abc3");
  20. }
复制代码
1点击效果

  1. private void btnWait_Click(object sender, EventArgs e)
  2. {
  3.      //建议使用:Monitor(语法糖lock关键字),Mutex(互斥锁),Event,Semaphore代替Suspend和Resume
  4.      ManualResetEvent resetEvent = new ManualResetEvent(false);
  5.      ThreadPool.QueueUserWorkItem(o =>
  6.      {
  7.          //锁资源 lock(资源){},当线程用完资源后,释放资源,资源才能被其他线程使用。
  8.          //只有一个分线程时,不建议去锁资源。
  9.          lock (o)
  10.          {
  11.              //分线程的代码是有序的,线程和其他线程的执行是无序的,想有序借助优先级。
  12.              this.DoSomething(o.ToString());
  13.              resetEvent.Set();//在分线程中通过ManualResetEvent类的Set方法,可以向主线程发送信号
  14.          }
  15.      }, "执行分线程");
  16.      resetEvent.WaitOne();//阻塞当前线程,等待分线程的Set()执行,才会继续执行
  17.      Console.WriteLine("主线程执行完毕");
  18. }
复制代码
2点击效果

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3.      ManualResetEvent resetEvent = new ManualResetEvent(false);
  4.      ThreadPool.QueueUserWorkItem(data =>
  5.      {
  6.          int num = (int)data;
  7.          long result = Fibonacci(num);
  8.          Invoke(new Action(() =>
  9.          {
  10.              Console.WriteLine(result);
  11.              label1.Text = result.ToString();
  12.          }));
  13.          resetEvent.Set();
  14.      }, 40);
  15. }
复制代码
3点击效果

  1.   private void DoSomething(string v)
  2. {
  3.      Thread.Sleep(10000);
  4.      Console.WriteLine(v);
  5. }
  6. public static long Fibonacci(int n)
  7. {
  8.      if (n < 0)
  9.          throw new ArgumentOutOfRangeException(nameof(n), "参数必须为非负整数");
  10.      // 基准情况
  11.      if (n == 0) return 0;
  12.      if (n == 1) return 1;
  13.      // 纯递归调用
  14.      return Fibonacci(n - 1) + Fibonacci(n - 2);
  15. }
复制代码
概括:

.net 2.0出现线程池,线程池中可以存在多个线程,让线程池来自动管理(垃圾回收器GC和公共语言运行时CLR)。
好处:办理了部分Thread管理不便的题目,移除了无用的Thread API。进步线程运行性能。
重要API:QueueUserWorkItem(Callback,data)
5。Task使命?

Task在.net 4.0时出现,是在线程池基础上封装而来的,提供了对线程的延续,取消,等候,超时等方面功能。
6。取消使命?

CancellationTokenSource类,CancellationToken结构
CancellationTokenSource cts = new CancellationTokenSource();
cts.Cancel()、cts.IsCancellationRequested属性、cts.Token属性
7。延迟,等候?

Task.Delay(100).Wait(); // 延迟并等候,注意延迟实行也是异步的。
t.Wait() //等候,会阻塞主线程
Task.WaitAny()等候使命数组中任意一个使命完成。result使命数组中第一个完成的使命索引。
Task.WaitAll()等候所有的使命完成,没有返回值
Task.WhenAny()当使命数组中任意一个使命完成的时间,去做其他事情 。返回值Task
Task.WhenAll()当使命数组中所有使命都完成的时间,才去做其他事情 。返回值Task
8。拿分线程效果?分线程向主线程传值?

t.Result属性 配合 Task

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表