C#-多线程与异步操作

4 篇文章 2 订阅

1.多线程技术介绍

作用
    1.实现多任务
    2.解决延迟

应用
    计算量比较大的场景下,计算时长比较久的业务,比如英雄联盟中的战争迷雾,它要算很多可视化和迷雾的单位,需要独立的线程来进行计算
    在LOL中,每个正在战斗的房间,底层也是要求互相独立,可并行的.所以也需要多线程的支持.
    每次打开王者荣耀,要更新很多内容对不对,如果不使用多线程下载更新,那么速度会更慢
    ....
线程Thread .net4.0(.net4.0之前的多线程方式)

任务Task .4.0之后(Task是.net4.0之后对Thread的封装)

线程同步

2.Thread线程的创建、启动、阻塞

线程Thread .net4.0
    创建线程
        构建Thread实例 参数需要指定一个方法
        通过Start方法开始执行线程
        如果需要给方法传递参数 则使用匿名函数...
        如果有返回值怎么办
            定义变量 进行接收 
    暂停线程
        通过Thread实例调用Join,可以阻止其他线程的调用,直到由该实例表示的线程终止
        线程实例 .Join();
        可以给与传递一个参数 表示最长阻塞多长时间 单位毫秒 
    计时等待
        Thread.Sleep() 让线程休眠一段时间
        通过静态方法 可以让当前的线程等待一定的时间 由参数决定等待的时间 单位毫秒
        它只影响当前执行的线程,其他线程的依旧会执行
    中止线程
         thread.Abort();
        该方法中止方式是对线程进行销毁,它适用于当程序要关闭的时候进行调度,能够保证线程程序关闭,线程也被销毁.
        其他地方尽可能不要用,有其他方式,比如用在线程内部用了lock语句,那么强制关闭线程将会导致lock失效,从而有可能影响计算结果.
    通过信号控制线程
        ManualResetEvent
    检测线程状态
        thread.ThreadState
    前台线程和后台线程
        后台线程:程序停止后 可能还会继续执行
            软件开发
        前台线程:程序停止 都会停止掉所有前台线程 线程默认都是前台线程
    访问当前线程ID:
        Thread.CurrentThread.ManagedThreadId

代码如下(示例):

using System;
using System.Threading;

namespace ProjectThread
{
    public class ThreadDemo
    {
        public void Start()
        {
            //多个线程 可以同时执行不同的任务。。减少用户的等待
            //通过线程调用方法
            Thread t1 = new Thread(Thread01);
            t1.Start();
            
            Thread t2 = new Thread(Thread02);
            t2.Start();
            
            Thread t3 = new Thread(Thread03);
            t3.Start();
            
            int count = 0;
            Thread t4 = new Thread(() => { count = Thread04(500);});
            t4.Start();

            //等待线程执行完毕
            t4.Join();
            Console.WriteLine("count = " + count);

            // Thread01();
            // Thread02();
            // Thread03();
        }
        
        public void Thread01()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("Thread01 - " + i);
            }
        }
        
        public void Thread02()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("Thread02 - " + i);
            }
        }

        public void Thread03()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("Thread03 - " + i);
            }
        }
        
        public int Thread04(int count)
        {
            int _count = 0;
            for (int i = 0; i < count; i++)
            {
                _count++;
                Console.WriteLine("Thread04:" + i);
            }

            return _count;
        }
    }
}
namespace ProjectThread
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            ThreadDemo threadDemo = new ThreadDemo();
            threadDemo.Start();
        }
    }
}

3.Thread线程的休眠、暂停、继续、中止

代码如下(示例):

using System;
using System.Threading;

namespace ProjectThread
{
    /// <summary>
    /// 通过信号的形式 控制线程的暂停和继续
    /// </summary>
    class ManualResetEventDemo
    {
        //停止的信号
        ManualResetEvent mr = new ManualResetEvent(true);

        public ManualResetEventDemo()
        {
            Thread t = new Thread(Thread01);
            t.IsBackground = false;    //false前台线程 true后台线程
            t.Start();
            Start();
        }

        public void Start()
        {
            //发送一个让线程继续执行的信号
            mr.Set();
        }

        public void Stop()
        {
            mr.Reset();
        }

        public void Thread01()
        {
            Thread.Sleep(3000);
            int i = 0;
            while (true)
            {
                mr.WaitOne();
                //线程ID是系统自动分配的 每次都是不同的ID 每个线程是唯一的ID
                Console.WriteLine("线程的ID:" + Thread.CurrentThread.ManagedThreadId);
                i++;
                Console.WriteLine("i的值:" + i);
                Thread.Sleep(3000);
            }
        }
    }
}
using System;

namespace ProjectThread
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            // ThreadDemo threadDemo = new ThreadDemo();
            // threadDemo.Start();
            
            ManualResetEventDemo mre = new ManualResetEventDemo();
            Console.WriteLine("输入 start:继续执行线程 stop:停止线程");
            while (true)
            {
                string s = Console.ReadLine();
                if (s=="start")
                {
                    mre.Start();
                }
                else if (s == "stop")
                {
                    mre.Stop();
                }
            }
        }
    }
}

4.Task任务的运行、阻塞、计时等待

任务Task .4.0之后
    .net4.0之后推出的
        .net4.5又开放了更多接口
    创建任务
        无需传递参数的
        需要传递参数的
    接收返回值
    计时等待
    等待任务执行完毕
    取消任务
        CancellationToken
        bool 标志位 自定义逻辑 进行内部控制
            暂停任务 继续执行

代码如下(示例):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProjectThread
{
    class TaskDemo
    {
        public void Start() {
            //开始去执行三个任务 
            //Task.Run(Task01);
            //Task.Run(Task02);
            //Task.Run(Task03);


            //Task t4= Task.Run(()=> {
            //     mCount=Task04(80);
            // });

            //线程等待
            //等待线程的执行完毕
            //t4.Wait();

            //Console.WriteLine("COUNT:"+mCount);

            //计时等待
            Task.Run(Task05);
        }

        //异步操作
        private async void Task05()
        {
            while (true)
            {
                Console.WriteLine("Task05执行中...");
                //Task.Delay 可以执行一个延时的操作
                await Task.Delay(1000);//单位毫秒 1000ms=1
            }
        }

        public int mCount = 0;
        private int Task04(int count)
        {
            int _count=0;
            for (int i = 0; i < count; i++)
            {
                _count++;
                Console.WriteLine("Task04:" + i);
            }
            return _count;
        }

        private void Task03()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("Task03:" + i);
            }
        }

        private void Task02()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("Task02:" + i);
            }

        }

        private void Task01()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("Task01:" + i);
            }
        }
    }
}
using System;

namespace ProjectThread
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            TaskDemo taskDemo = new TaskDemo();
            taskDemo.Start();
            
            Console.ReadKey();
            
            // ThreadDemo threadDemo = new ThreadDemo();
            // threadDemo.Start();
            
            // ManualResetEventDemo mre = new ManualResetEventDemo();
            // Console.WriteLine("输入 start:继续执行线程 stop:停止线程");
            // while (true)
            // {
            //     string s = Console.ReadLine();
            //     if (s=="start")
            //     {
            //         mre.Start();
            //     }
            //     else if (s == "stop")
            //     {
            //         mre.Stop();
            //     }
            // }
        }
    }
}

5.Task任务的取消、暂停、继续

代码如下(示例):

6.多线程数据的同步

代码如下(示例):

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kerven_HKW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值