簡體   English   中英

如何在主線程上運行函數而不使用 Unity 中的協程

[英]How to run functions on main thread without using Coroutine in Unity

我遇到過一些關於使用協程在主線程上運行函數的文章,例如Thread Ninja

 IEnumerator StartExamples()
{
    //Jump to main thread
    yield return Ninja.JumpToUnity; 

    Destroy(someGameObject); //OK

    //Jump back to background thread
    yield return Ninja.JumpBack;  
}

它對我的代碼不起作用,因為我想從套接字偵聽器跳轉到主線程。

 SocketIOClient.Client socket;

 IEnumerator StartExamples()
 {
    socket.On("connect", (fn) =>
    {
        WriteLine("\r\nConnected event...\r\n");

        //Jump to main thread
        yield return Ninja.JumpToUnity; //ERROR: couldn't do a yield return 

        Destroy(someGameObject); 

        //Jump back to background thread
        yield return Ninja.JumpBack;  //ERROR: couldn't do a yield return 
    });
 }

那么我們有什么解決方法嗎? 我希望我可以像這樣跳轉到主線程:

 Dispatcher.BeginInvoke(() =>
{
    //Unity API
    Destroy(gameObject);
});

根據我的評論,使用uPromise ;

class Example
{
    private Promise BeginSocketConnection()
    {
        Deferred retPromise = new Deferred();

        socket.On("connect", (fn) =>
        {
            // We're no longer on the main thread ):
            // But we can resolve our promise!
            retPromise.Resolve();
        });

        return retPromise;
    }

    private void SocketConnectedSuccessfully()
    {
       // Executing on main thread
    }

    private void Start()
    {
        // We start in the main thread
        BeginSocketConnection().Done(x =>
        {
            SocketConnectedSuccessfully();
        });
    }
}

這不允許您在同一代碼塊內的線程之間跳轉,但是通過使用回調系統,您可以提醒主線程執行操作,而無需啟動混亂的協程並在各處產生混亂。 看起來和維護起來要好得多。

我最終使用了一個非常有用的擴展,稱為Unity Thread Helper 它是免費的,並且足以滿足我的需求!

這是用法:

 UnityThreadHelper.Dispatcher.Dispatch(() =>
        {
            Destroy(a);

        });

注意:Dispatcher是一個單例對象,它將在您第一次調用時初始化。 您必須在主線程上進行首次調用,因為它使用了一些Unity API。

 private void Start()
{
    var ugly = UnityThreadHelper.Dispatcher;
}

希望這可以幫助!

如果你不想使用擴展,比如其他評論中提到的 uPromise 和 Unity Thread Helper,也不想使用 MonoBehavior 的協程,你也可以使用SynchronizationContext

// On main thread, during initialization:
var syncContext = System.Threading.SynchronizationContext.Current;

// On socket listener thread
syncContext.Post(_ =>
{
    // This code here will run on the main thread
    Destroy(gameObject);
}, null);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM