统一执行sqlite操作时,场景冻结了几秒钟

时间:2018-08-29 04:08:09

标签: c# unity3d sqlite

在我的应用程序中具有“同步”数据之类的功能,在同步操作中,从服务器获取数据并将其存储在本地sqlite数据库中,然后将本地数据推送到服务器。当用户单击同步时,场景将冻结以完成推和拉操作。我如何摆脱这个问题。我试图像使用单独的线程来执行数据库操作一样,但是我遇到了类似持久性数据库操作仅在主线程上起作用的异常。如何在不冻结屏幕的情况下进行同步操作。请提出任何想法,谢谢。

这是我尝试过的示例代码

 var thread = new System.Threading.Thread(() =>
 {
     //do sqlite operations
 });

 thread.start();

1 个答案:

答案 0 :(得分:2)

您应该在另一个线程中执行昂贵的查询。查询返回后,您可以在主Thread中使用结果。我注意到您尝试使用Thread,但收到新错误:

  

get_persistentDataPath只能从主线程中调用。

这是因为您在另一个Application.persistentDataPath中使用了Thread。您不能在另一个Thread中使用大多数Unity API,而Application.persistentDataPath是其中之一。这是一个简单的修复。没有理由在另一个线程中使用Application.persistentDataPath。获取Application.persistentDataPath的值并存储在全局string中,然后在新线程中使用该全局变量。

例如:

请勿执行此操作(这是您当前正在执行的操作):

void Start()
{
    //This Start function is the main Thread (Unity's Thread)

    var thread = new System.Threading.Thread(() =>
    {
        //This is another Thread created by you

        //DO NOT DO THIS(Don't use Unity API in another Thread)
        string dbPath = Application.persistentDataPath;

        //do sqlite operations
    });
    thread.Start();
}

代替(在主线程中获取Application.persistentDataPath的变量,然后使用存储的值)

void Start()
{
    //This Start function is the main Thread (Unity's Thread)

    //Get path in the Main Thread
    string dbPath = Application.persistentDataPath;

    var thread = new System.Threading.Thread(() =>
    {
        //This is another Thread created by you

        //Use the path result here


        //do sqlite operations
    });
    thread.Start();
}

最后,如果您真的需要使用Application.persistentDataPath以外的其他Unity API,或者例如,使用数据库中的结果更新UI Text组件,则可以使用我的UnityThread插件来简化操作

public Text yourTextComponent;

void Start()
{
    UnityThread.initUnityThread();
    //This Start function is the main Thread (Unity's Thread)

    //Get path in the Main Thread
    string dbPath = Application.persistentDataPath;

    var thread = new System.Threading.Thread(() =>
    {
        //This is another Thread created by you

        //do sqlite operations

        //Show result on UI
        UnityThread.executeInUpdate(() =>
        {
            yourTextComponent.text = queryResult;
        });
    });
    thread.Start();
}