2016-11-28 1 views
0

я сильно использовать UniRx в моем проекте, но я нахожу проблему, когда я первый звонок SchedulerOn(Scheduler.MainThread) он не будет делать вещи, оставленные в главном thread.Uses кода, как это:UniRx SchedulerOn MainThread не работает в первый раз вызвать

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(); 
    } 
}); 

Вывод показывает, что SetActive может быть вызван в основном потоке.
Проблема возникла особенно при открытии ПК и первом запуске приложения.
Это связано с тем, что .NET разогревается? Я не уверен, как работает диспетчер потоков.

UPDATE
Я думаю, что я потеря некоторые важные вещи.
Login возвращение RSG.IPromise<T> (git home page at here), который используется для легкой задачей asyc но RSG.Promise Lib не имеет планировщик module.So Я обернуть SchedulerPromise с UniRx «s IScheduler и код не имеет новую технологию. See this please about the wrapper source code

Я застрял здесь долгое время. Спасибо за любые советы.

+0

В какой библиотеке/пространствах имен это 'SchedulerOn' на самом деле существует? – supertopi

+0

@supertopi, это равно 'SubscribeOn', извините, не объясните это. Я добавляю деталь в ** UPDATE ** – LoranceChen

+0

Если я попробую и вызывать код Unity с obvserver, я получаю ', может быть вызван только из основного потока. Конструкторы и инициализаторы полей будут выполняться из загружаемого потока при загрузке сцены. ' Если я не поставил '.ObserveOnMainThread()' – sentece

ответ

0

UniRx запускает планирование по отдельным потокам, но Unity однопоточно и не является потокобезопасным. Он предотвращает запуск кода, который обращается к его объекту в отдельном потоке.

UniRX предлагает способ присоединиться подписку на наблюдаемую на его основной поток, чтобы разрешить запуск кода, обращающегося объекты Unity:

.ObserveOnMainThread()

+0

My SchedulerOn завершает ложную отправку планировщика UniRx. «ObserveOnMainThread» очень полезен ~ – LoranceChen

Смежные вопросы