设为首页 加入收藏

TOP

异步和多线程Thread(一)
2019-09-23 11:16:44 】 浏览:114
Tags:异步 线程 Thread

刚接触线程的时候,感觉这个东西好神奇。虽然不是很明白,就感觉它很牛逼。

参考了一些大佬写的文章:

https://www.cnblogs.com/yilezhu/p/10555849.html这个大佬写的文章,我还是很喜欢的

https://www.cnblogs.com/mushroom/p/4575417.html

 

多线程是.NET开发非常重要的一块,很多开发者对多线程几乎不用/很畏惧/不明所以,写代码的时候,没有考虑到多线程的场景。

什么是进程?

  计算机概念,程序在服务器运行占据全部计算机资源的综合,是一种虚拟的概念。

  当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。

  而一个进程又是由多个线程所组成的。

什么是线程?

  计算机概念,进程在响应操作时最小单位,也包括CPU、内存、网络、硬盘IO。

  线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

 

什么是多线程?

  计算机概念,一个进程有多个线程同时运行。

  多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

  

一个进程会包含很多个线程;线程是隶属于某个进程,进程毁了线程也就没了。

句柄:其实就是个long数字,是操作系统表示应用程序。

C#里面的多线程?

  Thread类,是C#语言对线程对象的一个封装。

为什么可以多线程?

  1、多个CPU的核可以并行工作,多个模拟线程

    四核八线程,这里面的线程值的是模拟核

  2、CPU的分片,1S的处理能力分成1000份,操作系统调度着去响应不同的任务。从宏观角度来说,感觉就是多个任务在并发执行;从微观角度来说,一个物理CPU同一时刻,只能为一个任务服务。

同步方法:

  发起调用,完成后才继续下一行;非常符合开发思维,有序执行。

  简单来说,就是诚心诚意请人吃饭,比如邀请bingle吃饭,但是bingle要忙一会,那就等着bingle完成后再一起去吃饭。

异步方法:

  发起调用,不等待完成,直接进入下一行,启动一个新线程开完成方法的计算。

  简单来说,就是客气一下的请人吃饭,比如要邀请bingle吃饭,但是bingle要忙一会,那你就忙着吧,我先去吃饭了,你忙完了自己去吃饭吧。

同步方法的代码:

 private void btnSync_Click(object sender, EventArgs e)
 {
     Console.WriteLine($"****************btnSync_Click Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
     int l = 3;
     int m = 4;
     int n = l + m;
     for (int i = 0; i < 5; i++)
     {
         string name = string.Format($"btnSync_Click_{i}");
         this.DoSomethingLong(name);
     }
     Console.WriteLine($"****************btnSync_Click   End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");

 }

 /// <summary>
 /// 一个比较耗时耗资源的私有方法
 /// </summary>
 /// <param name="name"></param>
 private void DoSomethingLong(string name)
 {
     Console.WriteLine($"****************DoSomethingLong Start  {name}  {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
     long lResult = 0;
     for (int i = 0; i < 1_000_000_000; i++)
     {
         lResult += i;
     }
     //Thread.Sleep(2000);

     Console.WriteLine($"****************DoSomethingLong   End  {name}  {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} {lResult}***************");
 }
View Code

调用后,是这个样子的结果;

 

 在这段期间内,界面是卡死的,无法拖动。

异步方法的代码:

private void btnAsync_Click(object sender, EventArgs e)
{
    Console.WriteLine($"****************btnAsync_Click Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
    Action<string> action = this.DoSomethingLong;

    //action.Invoke("btnAsync_Click_1");
    //action("btnAsync_Click_1");

    //委托自身需要的参数+2个异步参数
    //action.BeginInvoke("btnAsync_Click_1", null, null);

    for (int i = 0; i < 5; i++)
    {
        string name = string.Format($"btnAsync_Click_{i}");
        action.BeginIn
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇一步步到IOC 下一篇两种查看EFCore生成Sql语句的方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目