看看我是否在团结线上

Bor*_*ens 13 c# multithreading producer-consumer unity-game-engine

如何检查我所在的线程是否是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);
Run Code Online (Sandbox Code Playgroud)

但是当团结抛出异常时,无论是否捕获,程序都会停止.

如果我可以检查我是否在正确的线程上,我可以在排队和执行之间切换.

Bor*_*ens 16

我通过捕获整个线程然后等于它来解决它:

public void Start(){
    mainThread = System.Threading.Thread.CurrentThread;
}

bool isMainThread(){
    return mainThread.Equals(System.Threading.Thread.CurrentThread);
}
Run Code Online (Sandbox Code Playgroud)

相关:http://answers.unity3d.com/questions/62631/i-wonder-about-thread-id-plz-answer-me.html

  • 请注意,总是在主线程上调用`Update()`,因此检查你是否在`Update()`中的主线程上将始终导致`true`.我将编辑答案以在可以从任何线程调用的函数中检查它. (3认同)