简单了解线程和协程(C#)

这篇具有很好参考价值的文章主要介绍了简单了解线程和协程(C#)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.为什么需要线程和协程:
(1)使程序中的任务可以并发执行,让程序同时处理多个任务,提高程序的运行效率和响应速度
(2)线程和协程可以共享同一个进程的资源,避免多个进程之间的资源浪费
(3)可以动态调整程序的并发度,从而提高程序的可伸缩性,以便适应不同的负载情况
(4)将程序拆分为多个任务,使程序的结构更清晰,更易维护
2.线程和协程的区别:线程是由操作系统调度的,而协程则是由程序自身控制的。
线程的应用:
(1) 可以将一些耗时的操作放在子线程中进行,避免阻塞主线程,提高用户体验。
(2) 线程可以用来处理一些实时性要求比较高的任务,如网络通信、I/O操作等。
协程的应用:
(1)可以用来实现游戏中的动画效果,如角色的移动、攻击等。

(2)可以用来实现服务器中的异步请求处理,如异步读取数据库、异步处理请求等。

 一、线程 1..Thread类的一些属性

using System;
using System.Threading;

namespace ThreadTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ThreadStart childRef = new ThreadStart(ChildMethod);
            Thread th=new Thread(ChildMethod);
            th.Start();
            //Thread类的一些属性,属性表示的意思,可参考:https://www.runoob.com/csharp/csharp-multithreading.html
            Console.WriteLine(Thread.CurrentContext);
            Console.WriteLine(Thread.CurrentPrincipal);
            Console.WriteLine(Thread.CurrentThread);//获取当前正在运行的线程
            Console.WriteLine(th.CurrentCulture);
            Console.WriteLine(th.CurrentUICulture);
            Console.WriteLine(th.ExecutionContext);
            Console.WriteLine(th.IsAlive);//获取表示当前线程执行状态的一个值
            Console.WriteLine(th.IsBackground);是否为后台线程
            Console.WriteLine(th.IsThreadPoolThread);
            Console.WriteLine(th.ManagedThreadId);
            Console.WriteLine(th.Name);//获取或设置线程的名称
            Console.WriteLine(th.Priority);//获取或设置线程的调度优先级
            Console.WriteLine(th.ThreadState);
        }
        static void ChildMethod()
        {
            Thread.Sleep(2000);//线程休眠,让线程暂停一段时间
            Console.WriteLine("Child");
        }
    }
}

 2.创建线程

using System;
using System.Threading;

namespace ThreadTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //第一种方式,通过ThreadStart线程入口创建,它是一个无参无返回值的委托
            Thread th1 = new Thread(new ThreadStart(ThreadTest));
            //第二种方式,直接传递方法,这方式本质是与第一种方式是一样的,直接传递方法后,Thread内部会自动转成ThreadStart,因此一般情况不用担心因为重载问题而使它报错,因为TreadStart是无参无返回值的,它会自动匹配对应的方法类型,如果没有找到对应的类型就会提示报错
            Thread th2 = new Thread(ThreadTest1);
            //第三种方式,通过ParameterizedThreadStart创建,它是一个有参无返回值的委托,且只有一个参数
            Thread th3=new Thread(new ParameterizedThreadStart(ThreadTest2));
            //第四种方式,使用Lambda表达式创建线程,可以自己定义参数的传递
            //至于为什么可以这样写,可以参考:https://www.cnblogs.com/eve612/p/14342087.html
            Thread th4 = new Thread(() => ThreadTest3("Lambda","很好用"));
            th1.Start();//开启线程
            th2.Start();
            th3.Start();
            th4.Start();
        }

        static void ThreadTest()
        {
            Console.WriteLine("Thread");
        }
        static void ThreadTest1()
        {
            Console.WriteLine("Thread1");
        }
        static void ThreadTest2(object obj)
        {
            Console.WriteLine("ParameterizedThreadStart");
        }
        static void ThreadTest3(string str,string info)
        {
            Console.WriteLine(str+info);
        }
    }
}

更多内容:https://www.cnblogs.com/eve612/p/14342087.html

3.终止线程

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ThreadTest
{
    internal class Program
    {

        static void Main(string[] args)
        {
            Console.WriteLine("主线程开始");
            Thread th = new Thread(new ThreadStart(Test));
            th.Start();
            Thread.Sleep(1000);//线程休眠,阻止当前线程1s
            //终止进程,会引发ThreadAbortException异常
            //th.Abort();
            th.Abort("我们要终止子线程");//重载方法,终止进程的同时传递终止的异常信息
            Console.WriteLine("主线程结束");
        }
        static void Test()
        {
            try
            {
                Console.WriteLine("子线程开始");
                for(int i=0;i<10;i++)
                {
                    Thread.Sleep(400);
                    Console.WriteLine(i);
                }
            }
            catch(ThreadAbortException e)
            {
                //Console.WriteLine(e.Message);
                Console.WriteLine(e.ExceptionState);//打印终止的异常信息
            }
            finally
            {
                Console.WriteLine("捕获不到异常");
            }
            Console.WriteLine("子线程结束");
        }
    }
}

4.线程优先级:每个线程都有一个默认优先级,优先级高的线程相对于低级别的线程更有机会被优先调度,但并非绝对的。(优先级值从高到低:Highest,AboveNormal,Normal,BelowNormal,Lowest)

using System;
using System.Threading;

namespace ThreadTest
{
    internal class Program
    {

        static void Main(string[] args)
        {
            Thread th1 = new Thread(new ThreadStart(Test));
            Thread th2 = new Thread(new ThreadStart(Test2));
            th2.Priority=ThreadPriority.Highest;
            th1.Priority=ThreadPriority.Lowest;
            th1.Start();
            th2.Start();
        }
        static void Test()
        {
            for(int i = 0; i < 10; i++)
            {
                Console.WriteLine("子线程1");
            }
        }
        static void Test2()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("子线程2");
            }
        }
    }
}

c# 协程,C#,c#,开发语言,unity

5.Lock:实现线程同步 线程同步:一个线程要等待上一个线程执行完之后才能开始执行当前线程 线程异步:线程各走各的,不需要相对等待就开始执行

using System;
using System.Threading;

namespace ThreadTest
{
    internal class Program
    {
        static LockTest kt=new LockTest();
        static void Main(string[] args)
        {
            Thread th1 = new Thread(new ThreadStart(kt.Test));
            Thread th2 = new Thread(new ThreadStart(kt.Test2));
            th1.Start();
            th2.Start();
        }
    }
    public class LockTest
    {
        public void Test()
        {
            lock (this)//给线程加锁,确保代码块能完整运行,而不会被其它线程打断,this不能在静态方法中使用
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("子线程1");
                }
            }
        }
        public void Test2()
        {
            lock(this)
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("子线程2");
                }
            }
        }
    }
}

参考:

https://www.cnblogs.com/zhan520g/p/11388591.html
https://blog.csdn.net/u012395622/article/details/46581359
https://www.runoob.com/csharp/csharp-multithreading.html
https://blog.csdn.net/m0_67296957/article/details/126910726
https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.thread?view=net-7.0

二、协程:在主程序运行的同时,开启另外一段逻辑处理,来协助主程序的执行。在Unity中使用协程,大多数情况是为了延时调用某个功能方法、模块
注:如果开启的协程比较多,多个高开销的协程在同一帧执行会导致卡顿,因此常用于并行性要求不高的并行操作或延时执行等控制时间轴的操作(对于延时调用,Unity还有一个Invoke函数,但是Invoke所要调用的函数必须是在当前类里面的方法)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IEnumeratorTest : MonoBehaviour
{
    Coroutine mCoroutine=null;//定义协程
    WaitForSeconds waitS = new WaitForSeconds(5.0f);
    // Start is called before the first frame update
    void Start()
    {
        //调用和暂停协程
        //方式一
        //StartCoroutine(Test());
        //StopCoroutine(Test());这种方式无法停止协程
        //方式二
        //StartCoroutine("Test");
        //StopCoroutine("Test");//可以暂停协程
        //方式三
        mCoroutine = StartCoroutine(Test());
        //StopCoroutine(mCoroutine);//可以暂停协程
    }
    //协程函数
    IEnumerator Test()
    {
        Debug.Log("开始");
        //yield的多用方法:
        //yield return new WaitForEndOfFrame();//每帧结束后再执行
        //yield return new WaitForFixedUpdate();//等待FixEdUpdate结束后再执行
        //yield return new WaitForSeconds(5.0f);//等待5s后执行
        //用全局中断指令来控制
        //yield return waitS;//等待5s后执行
        yield return StartCoroutine(Test2());//在协程中开启协程,协程一旦开启,就会立即执行
        Show();
        Debug.Log("等待了5s");
    } 
    IEnumerator Test2()
    {
        //yield return new WaitForSeconds(2.0f);//程序等待N秒后从当前位置继续执行
        //yield return null;//程序在下一帧中从当前位置继续执行
        //yield return 0;//程序在下一帧中从当前位置继续执行
        yield break;//直接终止协程
        Debug.Log("第二个协程");
    }
    void Show()
    {
        Debug.Log("Show");
    }
}

参考:Unity C# 协程:(开始一个协程、停止一个协程、优化协程、协程中yield的用法)_c#停止协程_Iamzls的博客-CSDN博客

结语:合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。文章来源地址https://www.toymoban.com/news/detail-672978.html

到了这里,关于简单了解线程和协程(C#)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入分析 Java、Kotlin、Go 的线程和协程

    Go 语言比 Java 语言性能优越的一个原因,就是轻量级线程 Goroutines (协程Coroutine)。本篇文章深入分析下 Java 的线程和 Go 的协程。 协程并不是 Go 提出来的新概念,其他的一些编程语言,例如:Go、Python 等都可以在语言层面上实现协程,甚至是 Java,也可以通过使用扩展库来

    2024年02月01日
    浏览(39)
  • 协程是怎么实现的,如何用纯C#怎么实现协程,携程和线程的区别

    协程(Coroutine)是一种特殊的函数,可以暂停执行并在稍后恢复执行。在Unity中,协程通常用于实现一些异步操作,如等待一段时间后再执行某个操作,或者分步执行一个复杂的操作。 在Unity中,协程可以使用C#的yield来实现。yield语句可以暂停协程的执行,并在稍后恢

    2024年02月04日
    浏览(47)
  • 【unity】C#协程IEnumerator的使用(下)

    在Unity中,使用协程可以很方便地实现延时执行,即在一定的时间后执行某个代码块。例如,我们可

    2024年02月01日
    浏览(38)
  • Python 华为面试手撕代码 + 八股文,机器学习参数调节,损失函数,激活函数,线程、进程和协程

    一、手撕代码:力扣原题905 二、八股文部分:有点紧张,忘了好多东西 1.深度学习模型优化的方法有哪些? 深度学习模型的优化策略包括以下几个方面: (1)选择合适的激活函数:激活函数对模型的表达能力和收敛速度有很大影响,常用的激活函数包括ReLU、Sigmoid、Tanh等。

    2024年02月09日
    浏览(42)
  • Unity中C#使用协程控制Shader材质变化

    在上一篇文章实现了C#脚本简单修改Shader材质的效果后,我们使用按钮点击结合协程来实现一下游戏中角色常见的效果:受击、中毒、消融效果 我们继续使用上一篇的 Shader 和 C# 脚本来继续测试 Unity中C#如何访问并修改Shader材质 Unity中的协程可以理解为 C# 中多线程的作用,在

    2024年02月04日
    浏览(48)
  • Unity3D中的C#协程(概念、使用方法、底层原理)

             Unity3D 中的协程是针对 Unity3D 框架和 C# 编程语言定制的 ,具有便捷的使用方式和良好的效率。其他语言Python、Lua等也支持协程,但是底层实现的细节可能不同。在 Unity3D 引擎中, 协程被 Unity3D 引擎的主循环所驱动 。         协程(Coroutine)是一种编程概念

    2024年02月08日
    浏览(51)
  • C#编程-了解线程的优先级

    控制线程行为的一个属性是它的优先级。.NET运行时环境基于它们的优先级执行线程。CPU一次仅执行一个线程。因此,处于执行的可运行状态的线程,排队等待轮到被处理器执行。线程是固定优先级调度的。带有优先级的每个线程在处理器的线程队列中有自己的位置。 线程优

    2024年01月16日
    浏览(36)
  • unity C# 多线程

    线程  被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。 线程是 轻量级进程 。一个使用线程的常见实例是现代操作系统中并行编程的实现

    2024年02月04日
    浏览(33)
  • unity C#什么是线程锁,以及使用案例

    线程锁的原理主要是为了在多线程环境下提供对共享资源访问的同步机制,防止多个线程同时读写同一数据导致的数据不一致、竞态条件和死锁等问题。以下是线程锁基本工作原理的概述: 1. 互斥 (Mutual Exclusion): 线程锁的核心原理是互斥,即在同一时刻,只有一个线程能

    2024年01月22日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包