当前位置:   article > 正文

Unity协程认知_unity 协程调用dll主线程阻塞

unity 协程调用dll主线程阻塞

协程使用之前请注意以下几点:

1.协程只需要调用一次,只需要调用一次,只需要调用一次 !

2.yield return表示挂起,挂起的意思是协程里的变量会被保留,直到达到return的条件才会执行return以下的代码片段。

举个例子:

yield return new WaitForSeconds(0.9f);//执行到这儿,等待0.9s,继续执行这句代码以下的代码片段
  • 1

3.开启协程的方式:

a.StartCorountine("协程函数名");
b.StartCorountine(协程函数名(协程形参));//可以传多个参数
  • 1
  • 2

4.协程只需调用一次,但可以控制内部执行次数:

a.一次:不需要判断语句
举个例子:
  • 1
  • 2
IEnumerator OnlyOnce()//i++和++i的差别请自行百度
{
	int i = 0;
	yield return i++;//i加1以后执行Debug语句
	Debug.Log("i = {0}" + i);
}
void Start()
{
	StartCorountine("OnlyOnce");//控制台输出:i = 1
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

b.有限次:需要判断语句
举个例子:

IEnumerator FiniteTimes()
{
	int i = 0;
	while(i < 9)
	{
		i++;
		//只需要执行协程,无条件挂起,可以用yield return null 或者 yield return 0
		yield return i;
	}
	Debug.Log("i = " + i);
}
void Start()
{
	StartCorountine(FiniteTimes());//输出: i = 9
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

c.无限次,类似Update或者FixedUpdate函数:永真式->while(true)
举个例子:

IEnumerator AllTheWay()
{
    int i = 0;
	while(true)
	{
		yield return ++i;
		if(i > 9)
		{
			yield break;//yield break为结束循环的语句,表示协程内的循环执行到这儿结束,类似一般循环中的break
		}
		
		Debug.Log("i = " + i);//会输出1-9
		
		//可以多个yield return语句同时使用
		yield return new WaitForSeconds(0.9f);//等待0.9秒,执行下面代码块
		yield return new WaitForEndOfFrame();//等待所有GameObject渲染完成之后执行后面语句
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

5. 一个最近弄明白的坑(错了,具体请看下面仰望星空的评论)


目标:点击UGUI的button,立即输出“CallFunc()”
  • 1
	//将CallFunc挂到UGUI的button上,点击button,然后..........
	//然后等2.9s后才会输出“CallFunc()”
	public void CallFunc()
	{
		Debug.Log("CallFunc()");
		StartCoroutine(Func());
	}
	IEnumerator Func()
	{
		yield return new WaitForSeconds(2.9f);
		Debug.Log("Func()");
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

解决方法: 协程前面加一行代码(a)yield return 0;(b)yield return null;

	IEnumerator Func()
	{
		//yield return null;
		yield return 0;
		yield return new WaitForSeconds(2.9f);
		Debug.Log("Func()");
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

6.协程不是多线程:

协程是在主线程(Main Thread)执行的过程中开启的一段逻辑处理,和主线程共用一份资源,挂起的时候不会阻塞主线程,但要注意的是同一时刻只运行一个协程;多线程则不能共享主线程里的资源,需要关心同步以及锁的问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/126710?site
推荐阅读
相关标签
  

闽ICP备14008679号