2016-11-28 2 views
0

ich stark UniRx in meinem Projekt verwenden, aber ich finde, ein Problem, wenn ich es zuerst SchedulerOn(Scheduler.MainThread) Anruf nicht wie diese in Haupt thread.Uses Code links Dinge tun:UniRx SchedulerOn Mainthread arbeitet nicht zum ersten Mal aufrufen

Login (new LoginReq (account.text, pwd.text, 1L)).SchedulerOn(Scheduler.MainThread).Done (x => { 
    Debug.Log("login req thread - " + System.Threading.Thread.CurrentThread.ManagedThreadId); 
    Package.Log("Login response - " + x.ToString()); 
    if(x.errorMsg == null) { 
     Package.Log("login success - " + x.ToString()); 
     //choice game world -> choice role 
     enterObj.SetActive(true); 
     loginObj.SetActive(false); 
    } else { 
     rspTips.text = x.ToString(); 
    } 
}); 

Die Ausgabe zeigt SetActive kann nur am Haupt-Thread aufgerufen werden.
Das Problem trat besonders dann auf, wenn ich den PC öffne und die Anwendung starte.
Ist es wegen .NET aufwärmen? Ich bin mir nicht sicher, wie der Thread-Versand funktioniert.

UPDATE
Ich denke, ich bin ein paar wichtige Dinge verloren.
Login return RSG.IPromise<T> (git home page at here), die zu leichten asyc Aufgabe verwendet, aber RSG.Promise lib nicht Scheduler hat module.So Ich wickle ich ein SchedulerPromise mit UniRx ‚s IScheduler und der Code nicht neue Technologie hat. See this please about the wrapper source code

Ich bin hier eine lange Zeit stecken geblieben. Danke irgendeinen Rat.

+0

In welcher Bibliothek/Namensraum ist 'SchedulerOn' wirklich? – supertopi

+0

@supertopi, es entspricht "SubscribeOn", sorry nicht erklären this.Ich füge ein Detail bei ** UPDATE ** – LoranceChen

+0

Wenn ich versuche Unity-Code von einem Observer zu bekommen bekomme ich 'kann nur aus dem Haupt-Thread aufgerufen werden. Konstruktoren und Feldinitialisierer werden beim Laden einer Szene vom Lade-Thread ausgeführt. ' Wenn ich nicht '.ObserveOnMainThread()' – sentece

Antwort

0

UniRx führt seine Planung auf separaten Threads aus, aber Unity ist single threaded und nicht Thread-sicher. Es verhindert, dass Code, der auf sein Objekt zugreift, in einem separaten Thread ausgeführt wird.

UniRX stellt ein Verfahren das Abonnement des beobachtbaren auf seinen Haupt-Thread zu verbinden Code zu ermöglichen ausgeführt wird, die Unity-Objekte zugreift:

.ObserveOnMainThread()

+0

Mein 'SchedulerOn' wickelt einen falschen Versand von' UniRx''s Scheduler ab. Das 'ObserveOnMainThread' ist sehr hilfreich ~ – LoranceChen