siki老师您好,我现在遇到网络接收的线程不能直接调用主线程的方法,比如 CancelInvoke、 SceneManager.LoadSceneAsync这些等等,希望老师帮忙讲下这种需求怎么设计能解决而且执行效率高些并考虑到线程安全性。
方法存存在于进程的代码区,是不区分线程的。。任何线程都可以调用任何方法。你说的不能调用,应该是因为你没有提供给线程要调用的方法所属的类的那个对象而已。
比如:
public class a {
public someFunc();
}
static void Thread()
{
// 这里你想调用A里面的somfunc,你得提供一个a类的对象。
}
线程安全性,可以通过使用各种内核对象,比如:信号量、互斥对象、内存映射、临界区变量等等。。根据需求来。
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class EventProcessor : MonoBehaviour {
private static System.Object m_queueLock = new System.Object();
private static List<Action> m_queuedEvents = new List<Action>();
private static List<Action> m_executingEvents = new List<Action>();
private volatile static bool noActionQueueToExecuteUpdateFunc = true;
void Awake()
{
DontDestroyOnLoad (this.gameObject);
}
void Update() {
if (noActionQueueToExecuteUpdateFunc)
{
return;
}
MoveQueuedEventsToExecuting();
while (m_executingEvents.Count > 0) {
Action e = m_executingEvents[0];
m_executingEvents.RemoveAt(0);
e();
}
noActionQueueToExecuteUpdateFunc = true;
}
public static void QueueEvent(Action action) {
lock(m_queueLock) {
m_queuedEvents.Add(action);
noActionQueueToExecuteUpdateFunc = false;
}
}
private void MoveQueuedEventsToExecuting() {
lock(m_queueLock) {
while (m_queuedEvents.Count > 0) {
Action e = m_queuedEvents[0];
m_executingEvents.Add(e);
m_queuedEvents.RemoveAt(0);
}
}
}
}