看看我是不是在统一线程上
Posted
技术标签:
【中文标题】看看我是不是在统一线程上【英文标题】:Find out if I'm on the unity thread看看我是否在统一线程上 【发布时间】:2014-12-14 15:58:34 【问题描述】:如何检查我所在的线程是否是 Unity 线程?
我尝试在构造函数时捕获 threadId,但在程序生命周期的某个地方,threadId 会移动。
在我的项目中,一些辅助线程进程需要访问新创建的对象。
我使用生产者-消费者模式,因此可以在 Unity 线程上创建它们。
对象工厂对请求进行排队,并在Update()
上,我请求的对象在正确的线程上实例化。在 Queued 和 Instantiated 之间,工厂方法等待带有 AutoResetEvent 的 ObjectCreated 事件。
现在有时会从主线程调用这个工厂,AutoResetEvent 会阻塞它自己的线程。 我还用
尝试了肮脏的方式// First try on this thread
try
return action();
catch (ArgumentException ex)
Debug.Log("Tried on same thread, but failed. "+ex.Message);
PushToQueueAndWait(action);
但是当 unity 抛出异常时,无论是否捕获,程序都会停止。
如果我可以检查我是否在正确的线程上,我可以在排队和执行之间切换。
【问题讨论】:
我从来没有见过主线程ID变化,你是如何获得价值的?System.Threading.Thread.CurrentThread.ManagedThreadId
对我有用,并且在我的测试过程中不会改变。此外,在 Unity 编辑器的预览模式下运行线程代码可能会导致意外行为。
System.Threading.Thread.CurrentThread.ManagedThreadId 似乎从构造函数时的状态和运行中途的状态发生了变化。不知道任何细节。我在某处读到它可能与编辑器有关。试图不那么模糊,但还没有找到模式。
我怀疑 Unity 的主线程是否会改变。这表明它会冻结主事件循环,将该状态复制到新线程,然后重新开始循环。 Unity 不支持多线程,所以很难想象他们为什么要设计这样的东西。如果您开发了该问题的工作示例,将会很高兴。
answers.unity3d.com/questions/62631/…
【参考方案1】:
我通过捕获整个线程然后将其相等来解决它:
public void Start()
mainThread = System.Threading.Thread.CurrentThread;
bool isMainThread()
return mainThread.Equals(System.Threading.Thread.CurrentThread);
相关:http://answers.unity3d.com/questions/62631/i-wonder-about-thread-id-plz-answer-me.html
【讨论】:
请注意,Update()
始终在主线程上调用,因此检查您是否在 Update()
内的主线程上将始终返回 true
。我将编辑答案以在可以从任何线程调用的函数中检查它。【参考方案2】:
我同意鲍里斯·卡伦斯的观点,但有一点,
检查时应使用mainThread.ManagedThreadId == System.Threading.Thread.CurrentThread.ManagedThreadId
。 Equals
默认为 Object 且无法正常工作。
【讨论】:
“工作不正常” mainThread.Equals(System.Threading.Thread.CurrentThread) 有什么问题?以上是关于看看我是不是在统一线程上的主要内容,如果未能解决你的问题,请参考以下文章
Java技术指南「技术盲区」看看线程以及线程池的异常处理机制都有哪些?
Java技术专题「技术盲区」看实战出发看看线程以及线程池的异常处理机制都有哪些?