Closed mimicryryu closed 5 years ago
targetSdkVersion 26 compileSdkVersion 28
在 ContinueWith() 中的代码是执行在子线程的,我猜测是你的 lua 代码执行在了子线程导致的那个报错。 两种解决方法:
我的luafunction会通过一个EnqueueMainThreadCallback方法排队到主线程调用的,我想应该不是这个问题
void EnqueueMainThreadCallback(System.Action call) {
bool enqueued = false;
while (!enqueued) {
if (Monitor.TryEnter(m_mainThreadCallbackQueueLock, 50)) {
m_mainThreadCallbackQueue.Enqueue(call);
enqueued = true;
Monitor.Exit(m_mainThreadCallbackQueueLock);
}
}
}
void LateUpdate() {
CallMainThreadCallbacks();
}
void CallMainThreadCallbacks() {
if (Monitor.TryEnter(m_mainThreadCallbackQueueLock)) {
while (m_mainThreadCallbackQueue.Count > 0) {
m_mainThreadCallbackQueue.Dequeue()();
}
Monitor.Exit(m_mainThreadCallbackQueueLock);
}
}
我这边华为的P20pro是9系统,倒是没有问题,一台MIX3(MIUI10.3 Android9)出现了上述问题。我再观察别的设备看看吧
void EnqueueMainThreadCallback(System.Action call) { bool enqueued = false; while (!enqueued) { if (Monitor.TryEnter(m_mainThreadCallbackQueueLock, 50)) { m_mainThreadCallbackQueue.Enqueue(call); enqueued = true; Monitor.Exit(m_mainThreadCallbackQueueLock); } } } void LateUpdate() { CallMainThreadCallbacks(); } void CallMainThreadCallbacks() { if (Monitor.TryEnter(m_mainThreadCallbackQueueLock)) { while (m_mainThreadCallbackQueue.Count > 0) { m_mainThreadCallbackQueue.Dequeue()(); } Monitor.Exit(m_mainThreadCallbackQueueLock); } }
这样实现可能死锁吧,如果在回调中会产生要插入主线程队列的情况
如果使用 .net 4.x,建议使用文档中 await/async 的方式
线程问题应该是我这边用的bugly插件的问题,在分线程上上报错误时导致闪退了(昨天leancloud服务器有问题
如果选.net 4.6会闪退,CreateClient的时候对task result得到的client的访问会导致invalid pthread_t xxxx passed to libc 奔溃 选.net3.5不会闪退,但是对client的访问会导致线程卡主
创建Client的代码