当前位置:   article > 正文

unity 主线程调用_UnityEngine C# - 从主线程中调用方法

c#调用unity主线程方法

I'm having trouble with a UnityEngine version. (Can't upgrade, game is not mine)

The server RANDOMLY crashes when a specific UnityEngine method is used in a timer/thread (It was fixed in a version, I read It)

It happens totally random, I get a crash log, that starts from the timer/thread and ends at a UnityEngine method. (This never happens when I use It in the main thread)

My question is that Is It possible somehow to call the method from the main thread if the current thread != with the main thread?

Any help is appreciated

解决方案

This Loom class is able to call the specific method from the Main thread, this is how you do It:

public class Loom : MonoBehaviour

{

public static int maxThreads = 10;

static int numThreads;

private static Loom _current;

private int _count;

public static Loom Current

{

get

{

Initialize();

return _current;

}

}

public void Awake()

{

_current = this;

initialized = true;

}

static bool initialized;

static void Initialize()

{

if (!initialized)

{

if (!Application.isPlaying)

return;

initialized = true;

var g = new GameObject("Loom");

_current = g.AddComponent();

}

}

private List _actions = new List();

public struct DelayedQueueItem

{

public float time;

public Action action;

}

private List _delayed = new List();

List _currentDelayed = new List();

public static void QueueOnMainThread(Action action)

{

QueueOnMainThread(action, 0f);

}

public static void QueueOnMainThread(Action action, float time)

{

if (time != 0)

{

lock (Current._delayed)

{

Current._delayed.Add(new DelayedQueueItem { time = Time.time + time, action = action });

}

}

else

{

lock (Current._actions)

{

Current._actions.Add(action);

}

}

}

public static Thread RunAsync(Action a)

{

Initialize();

while (numThreads >= maxThreads)

{

Thread.Sleep(1);

}

Interlocked.Increment(ref numThreads);

ThreadPool.QueueUserWorkItem(RunAction, a);

return null;

}

private static void RunAction(object action)

{

try

{

((Action)action)();

}

catch

{

}

finally

{

Interlocked.Decrement(ref numThreads);

}

}

public void OnDisable()

{

if (_current == this)

{

_current = null;

}

}

// Use this for initialization

public void Start()

{

}

List _currentActions = new List();

// Update is called once per frame

public void Update()

{

lock (_actions)

{

_currentActions.Clear();

_currentActions.AddRange(_actions);

_actions.Clear();

}

foreach (var a in _currentActions)

{

a();

}

lock (_delayed)

{

_currentDelayed.Clear();

_currentDelayed.AddRange(_delayed.Where(d => d.time <= Time.time));

foreach (var item in _currentDelayed)

_delayed.Remove(item);

}

foreach (var delayed in _currentDelayed)

{

delayed.action();

}

}

}

//Usage

public void Call()

{

if (Thread.CurrentThread.ManagedThreadId != TestClass.MainThread.ManagedThreadId)

{

Loom.QueueOnMainThread(() => {

Call();

});

return;

}

Console.WriteLine("Hello");

}

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号