国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

協(xié)程是怎么實(shí)現(xiàn)的,如何用純C#怎么實(shí)現(xiàn)協(xié)程,攜程和線程的區(qū)別

這篇具有很好參考價(jià)值的文章主要介紹了協(xié)程是怎么實(shí)現(xiàn)的,如何用純C#怎么實(shí)現(xiàn)協(xié)程,攜程和線程的區(qū)別。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

攜程

協(xié)程(Coroutine)是一種特殊的函數(shù),可以暫停執(zhí)行并在稍后恢復(fù)執(zhí)行。在Unity中,協(xié)程通常用于實(shí)現(xiàn)一些異步操作,如等待一段時(shí)間后再執(zhí)行某個(gè)操作,或者分步執(zhí)行一個(gè)復(fù)雜的操作。

在Unity中,協(xié)程可以使用C#的yield關(guān)鍵字來(lái)實(shí)現(xiàn)。yield語(yǔ)句可以暫停協(xié)程的執(zhí)行,并在稍后恢復(fù)執(zhí)行。以下是一個(gè)簡(jiǎn)單的協(xié)程示例:

using System.Collections;
using UnityEngine;

public class CoroutineExample : MonoBehaviour
{
    private void Start()
    {
        StartCoroutine(MyCoroutine());
    }

    private IEnumerator MyCoroutine()
    {
        Debug.Log("協(xié)程開(kāi)始執(zhí)行");
        yield return new WaitForSeconds(1.0f);
        Debug.Log("等待了1秒鐘");
        yield return new WaitForSeconds(2.0f);
        Debug.Log("又等待了2秒鐘");
        yield return null;
        Debug.Log("協(xié)程執(zhí)行完畢");
    }
}

在上面的代碼中,MyCoroutine()方法是一個(gè)協(xié)程,使用StartCoroutine()方法來(lái)啟動(dòng)協(xié)程的執(zhí)行。在MyCoroutine()方法中,使用yield return語(yǔ)句來(lái)暫停協(xié)程的執(zhí)行。通過(guò)yield return new WaitForSeconds()語(yǔ)句可以等待一段時(shí)間,而yield return null語(yǔ)句表示暫停協(xié)程的執(zhí)行但不進(jìn)行等待,等待時(shí)間可以通過(guò)幀率來(lái)控制。

除了使用yield語(yǔ)句來(lái)實(shí)現(xiàn)協(xié)程外,也可以使用純C#來(lái)實(shí)現(xiàn)協(xié)程。一種常見(jiàn)的方式是使用迭代器(Iterator)和狀態(tài)機(jī)(StateMachine)來(lái)實(shí)現(xiàn)協(xié)程。以下是一個(gè)使用純C#實(shí)現(xiàn)的協(xié)程示例:

using System;
using System.Collections.Generic;

public class CoroutineExample
{
    private IEnumerator<object> coroutine;
    private bool paused;

    public CoroutineExample(IEnumerator<object> coroutine)
    {
        this.coroutine = coroutine;
        this.paused = false;
    }

    public void Start()
    {
        this.paused = false;
        this.Resume();
    }

    public void Stop()
    {
        this.paused = true;
    }

    public void Resume()
    {
        while (!this.paused && this.coroutine.MoveNext())
        {
            object yielded = this.coroutine.Current;
            if (yielded is IEnumerator<object>)
            {
                this.coroutine = (IEnumerator<object>)yielded;
            }
            else if (yielded is WaitForSeconds)
            {
                WaitForSeconds delay = (WaitForSeconds)yielded;
                DateTime resumeTime = DateTime.UtcNow.AddSeconds(delay.Seconds);
                while (DateTime.UtcNow < resumeTime)
                {
                    // Wait for the specified time
                }
            }
        }
    }

    private class WaitForSeconds
    {
        public float Seconds { get; set; }

        public WaitForSeconds(float seconds)
        {
            this.Seconds = seconds;
        }
    }
}

在上面的代碼中,CoroutineExample類是一個(gè)協(xié)程管理器,通過(guò)Start()方法來(lái)啟動(dòng)協(xié)程的執(zhí)行,通過(guò)Stop()方法來(lái)停止協(xié)程的執(zhí)行,通過(guò)Resume()方法來(lái)恢復(fù)協(xié)程的執(zhí)行。協(xié)程的代碼則是以IEnumerator<object>接口的形式傳遞給CoroutineExample類的構(gòu)造函數(shù)中的coroutine參數(shù)。在Resume()方法中,使用while循環(huán)來(lái)遍歷協(xié)程中的yield語(yǔ)句,如果協(xié)程被暫?;蛞呀?jīng)執(zhí)行完畢,則跳出循環(huán)。對(duì)于每個(gè)yield語(yǔ)句,使用coroutine.Current屬性來(lái)獲取yield語(yǔ)句的返回值,并根據(jù)返回值的類型進(jìn)行相應(yīng)的處理。如果返回值是IEnumerator<object>類型,則將協(xié)程的執(zhí)行轉(zhuǎn)移到新的迭代器中;如果返回值是WaitForSeconds類型,則通過(guò)等待指定時(shí)間的方式來(lái)暫停協(xié)程的執(zhí)行。

上面的純C#協(xié)程實(shí)現(xiàn)方式比較簡(jiǎn)單,但是不支持Unity的協(xié)程特性,例如可以通過(guò)yield return new WaitForEndOfFrame()語(yǔ)句來(lái)等待渲染幀結(jié)束后再執(zhí)行下一幀操作。因此,在Unity中,還是建議使用yield語(yǔ)句來(lái)實(shí)現(xiàn)協(xié)程。

攜程和線程的區(qū)別

Unity協(xié)程和線程都可以在程序中實(shí)現(xiàn)多任務(wù)的處理,但它們的實(shí)現(xiàn)機(jī)制和使用方式有所不同。

協(xié)程是一種輕量級(jí)的線程,可以在單個(gè)線程內(nèi)實(shí)現(xiàn)多個(gè)任務(wù)之間的切換,而無(wú)需創(chuàng)建多個(gè)線程。在Unity中,協(xié)程是通過(guò)yield return語(yǔ)句來(lái)實(shí)現(xiàn)的,它可以在等待某些操作完成期間暫停當(dāng)前函數(shù)的執(zhí)行,并在下一幀或者一段時(shí)間之后繼續(xù)執(zhí)行。

線程是程序中獨(dú)立的執(zhí)行流,可以在程序中同時(shí)運(yùn)行多個(gè)任務(wù)。線程通常需要在程序中顯式地創(chuàng)建和銷毀,并且需要進(jìn)行同步和互斥操作來(lái)避免數(shù)據(jù)競(jìng)爭(zhēng)和死鎖等問(wèn)題。在Unity中,如果需要進(jìn)行耗時(shí)的計(jì)算或者需要執(zhí)行阻塞操作(如網(wǎng)絡(luò)請(qǐng)求、文件讀寫等),可以使用線程來(lái)處理這些操作,避免卡死主線程。

總的來(lái)說(shuō),協(xié)程適用于需要在Unity主線程中執(zhí)行的任務(wù),例如動(dòng)畫、延遲等待、定時(shí)任務(wù)等,而線程則適用于需要執(zhí)行耗時(shí)操作的任務(wù),例如計(jì)算、網(wǎng)絡(luò)請(qǐng)求、文件讀寫等。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-763840.html

到了這里,關(guān)于協(xié)程是怎么實(shí)現(xiàn)的,如何用純C#怎么實(shí)現(xiàn)協(xié)程,攜程和線程的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 操作系統(tǒng)進(jìn)程線程(一)—進(jìn)程線程協(xié)程區(qū)別、多進(jìn)程多線程、進(jìn)程調(diào)度算法、進(jìn)程線程通信

    操作系統(tǒng)進(jìn)程線程(一)—進(jìn)程線程協(xié)程區(qū)別、多進(jìn)程多線程、進(jìn)程調(diào)度算法、進(jìn)程線程通信

    定義上 進(jìn)程: 資源分配和擁有 的基本單位,是調(diào)度的基本單位。 運(yùn)行一個(gè)可執(zhí)行程序會(huì)創(chuàng)建一個(gè)或者多個(gè)進(jìn)程;進(jìn)程就是運(yùn)行起來(lái)的程序 線程:程序 執(zhí)行 基本單位,輕量級(jí)進(jìn)程。 每個(gè)進(jìn)程中都有唯一的主線程 ,主線程和進(jìn)程是相互依賴的關(guān)系。 協(xié)程: 用戶態(tài) 的輕量級(jí)

    2024年02月01日
    瀏覽(96)
  • 攜程總監(jiān)的單元測(cè)試是怎么樣寫的?

    攜程總監(jiān)的單元測(cè)試是怎么樣寫的?

    ? 大家都知道,開(kāi)發(fā)軟件的時(shí)候?yàn)榇a編寫單元測(cè)試是很好的。但實(shí)際上,光有測(cè)試還不夠,還要編寫好的測(cè)試,這同樣重要。 要做到這一點(diǎn),考慮遵循一些固執(zhí)的原則,對(duì)測(cè)試代碼給予一些關(guān)愛(ài): 要做到這一點(diǎn),應(yīng)該要進(jìn)行毫不留情的重構(gòu),就像對(duì)生產(chǎn)代碼應(yīng)該做的那樣

    2024年02月03日
    瀏覽(17)
  • 攜程大牛的單元測(cè)試是怎么樣寫的?

    攜程大牛的單元測(cè)試是怎么樣寫的?

    大家都知道,開(kāi)發(fā)軟件的時(shí)候?yàn)榇a編寫 單元測(cè)試 是很好的。但實(shí)際上,光有測(cè)試還不夠,還要編寫好的測(cè)試,這同樣重要。 要做到這一點(diǎn),考慮遵循一些固執(zhí)的原則,對(duì)測(cè)試代碼給予一些關(guān)愛(ài): 1. 保持測(cè)試代碼的緊湊和可讀性 要做到這一點(diǎn),應(yīng)該要進(jìn)行毫不留情的重構(gòu)

    2024年04月12日
    瀏覽(17)
  • python正則+多線程(代理)+線程池+協(xié)程

    常用元字符 . 匹配除換行符以外的任意字符 w 匹配字幕或數(shù)字或下劃線 s 匹配任意空白字符 d 匹配數(shù)字 n 匹配一個(gè)換行符 t 匹配一個(gè)制表符 W 匹配非字母或數(shù)字或下劃線 D 匹配非數(shù)字 S 匹配非空白符 a|b 匹配字符a或b () 匹配括號(hào)內(nèi)的表達(dá)式,也表示一個(gè)組 […] 匹配字符

    2024年02月16日
    瀏覽(17)
  • 什么是進(jìn)程、線程、協(xié)程

    什么是進(jìn)程、線程、協(xié)程

    我們都知道計(jì)算機(jī)的核心是CPU,它承擔(dān)了所有的計(jì)算任務(wù);而操作系統(tǒng)是計(jì)算機(jī)的管理者,它負(fù)責(zé)任務(wù)的調(diào)度、資源的分配和管理,統(tǒng)領(lǐng)整個(gè)計(jì)算機(jī)硬件;應(yīng)用程序則是具有某種功能的程序,程序是運(yùn)行于操作系統(tǒng)之上的。 進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序在一個(gè)數(shù)據(jù)集上

    2024年02月13日
    瀏覽(26)
  • 進(jìn)程,線程,協(xié)程

    1、進(jìn)程 進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)??數(shù)據(jù)集??合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。每個(gè)進(jìn)程都有自己的獨(dú)立內(nèi)存空間,不同進(jìn)程通過(guò)進(jìn)程間通信來(lái)通信。由于進(jìn)程比較重量,占據(jù)獨(dú)立的內(nèi)存,所以上下文進(jìn)程間的切換開(kāi)銷

    2024年02月11日
    瀏覽(27)
  • 【Python】多線程編程 ① ( 線程相關(guān)概念 | 進(jìn)程 | 線程 | 協(xié)程 / 纖程 | 管程 )

    進(jìn)程 與 操作系統(tǒng) : 進(jìn)程 是 操作系統(tǒng) 中 能夠獨(dú)立運(yùn)行的單元 , 是 操作系統(tǒng) 對(duì) 正在運(yùn)行的 應(yīng)用程序 的 抽象結(jié)構(gòu) 描述 ; 操作系統(tǒng) 中 運(yùn)行的每個(gè) 應(yīng)用程序 就是一個(gè)進(jìn)程 ; 一個(gè)操作系統(tǒng)中可以運(yùn)行 多個(gè) 進(jìn)程 ; 每個(gè) 應(yīng)用程序 都會(huì)被 操作系統(tǒng) 分配一個(gè) 進(jìn)程 ID ; 多個(gè)進(jìn)程之間

    2024年02月15日
    瀏覽(24)
  • 【Java 并發(fā)編程】一文讀懂線程、協(xié)程、守護(hù)線程

    【Java 并發(fā)編程】一文讀懂線程、協(xié)程、守護(hù)線程

    在 Java 線程的生命周期一文中提到了 就緒狀態(tài)的線程在獲得 CPU 時(shí)間片后變?yōu)檫\(yùn)行中狀態(tài) ,否則就會(huì)在 可運(yùn)行狀態(tài) 或者 阻塞狀態(tài) ,那么系統(tǒng)是如何分配線程時(shí)間片以及實(shí)現(xiàn)線程的調(diào)度的呢?下面我們就來(lái)講講線程的調(diào)度策略。 線程調(diào)度是指系統(tǒng)為線程分配 CPU 執(zhí)行時(shí)間片

    2023年04月08日
    瀏覽(24)
  • Unity多線程和協(xié)程

    Unity多線程和協(xié)程

    Unity支持多線程的使用,可以使用C#的Thread類來(lái)創(chuàng)建和管理線程,只需要引入這個(gè)類: 但需要注意的是,在Unity中,只有主線程(也稱為渲染線程)可以訪問(wèn)Unity對(duì)象,如GameObject、Transform等,如果在其他線程中訪問(wèn)這些對(duì)象,會(huì)導(dǎo)致不可預(yù)期的結(jié)果。 因此,在使用多線程時(shí),

    2024年02月16日
    瀏覽(37)
  • C#編程-實(shí)現(xiàn)多線程

    C#編程-實(shí)現(xiàn)多線程

    多線程幫助同時(shí)執(zhí)行各種操作。這為用戶節(jié)省時(shí)間。多線程程序包括一個(gè)主線程和其他用戶定義的線程以同時(shí)執(zhí)行多個(gè)任務(wù)。 微處理器為執(zhí)行的進(jìn)程分配內(nèi)存。每個(gè)進(jìn)程占有內(nèi)存中它們自己的地址空間。但是,所有在進(jìn)程中的線程占有相同的地址空間。多線程允許在一個(gè)程序

    2024年02月02日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包