【发布时间】:2017-06-17 00:03:27
【问题描述】:
我对@987654321@ 的 firebase 1.1.0 有疑问。
一旦我通过FirebaseApp.DefaultInstance.SetEditorDatabaseUrl( myurl ) 激活了firebase,所有不是由firebase 生成的Tasks 都会在主线程上执行。
所以我可以很好地检索和发布数据到 firebase,甚至可以在任务中处理它。它们在单独的线程上运行,我在调试时看到了。但是,当我在某些 MonoBehaviour 的 Start 方法中使用 Task.Run( MyComputingFunction ) 时,Unity 会挂起。假设这个函数只是从0 计数到999999 所以它不是一个锁定 问题。由于任务在主线程上执行,计算时 Unity 会冻结。如果我将 firebase 激活注释掉,我的 task 将在单独的 thread 中运行并且不会冻结 Unity。
请帮忙。
这是一个最小的工作示例。将其附加到游戏对象并观察并行运行的任务。取消注释指出的行,任务将按线性顺序执行。
using UnityEngine;
using System;
using System.Threading.Tasks;
using Firebase.Unity.Editor;
using Firebase.Database;
public class NetworkController : MonoBehaviour
{
public static DatabaseReference @ref;
void Start()
{
// Uncomment line below
//InitializeDatabase();
TestStuff();
}
private void TestStuff()
{
Task.Run( Counter(1) );
Task.Run( Counter(2) );
Task.Run( Counter(3) );
}
private Action Counter( int i )
{
return delegate {
int a = 0;
while ( a + 10 < 900000 ) {
a++;
if ( a % 5000 == 0 )
Debug.Log( a + i);
}
};
}
private void InitializeDatabase()
{
Firebase.FirebaseApp.DefaultInstance.SetEditorDatabaseUrl( "https://dinosaur-facts.firebaseio.com/" );
@ref = FirebaseDatabase.DefaultInstance.RootReference;
}
}
【问题讨论】:
-
你能发布你的代码吗?
-
@MichaelDotKnox 我已经更新了我的帖子。
标签: c# multithreading unity3d firebase task