Zenject与UniRx结合实现跨线程通信Signal

  • 修改Zenject下ProfileBlock.cs源码, 取消有关UnityEngine.Profiling.Profiler的代码.
  • 然后使用Zenject的Signal:

   // 定义Signal
    public class TestCrossThreadCommEvent : Signal<string, TestCrossThreadCommEvent> { }

1   // Install Signals
2     Container.DeclareSignal<TestCrossThreadCommEvent>();

 1 // 启动线程
 2     tth = new Thread(() =>
 3     {
 4         while (true)
 5         {
 6             Thread.Sleep(1000);
 7             _crossThreadCommEvent.Fire("fire not in main thread");
 8             //_unityEvent.Invoke();
 9         }
10     });
11     tth.Start();
12     // UniRx
13     _crossThreadCommEvent.AsObservable.ObserveOnMainThread(MainThreadDispatchType.Update)
14         // 使用lambda表达式是没有问题的
15         .Subscribe(s => TestCrossThreadComm(s))
16         .AddTo(this);
17
18     void TestCrossThreadComm(string msg)
19     {
20         Debug.Log(Thread.CurrentThread.ManagedThreadId);
21         Debug.Log(msg);
22         transform.RotateAround(transform.position, Vector3.up, 5f);
23     }

  • 输出结果:

  1

  UnityEngine.Debug:Log(Object)

  fire not in main thread

  UnityEngine.Debug:Log(Object)

  • 多个参数情况:

1 // 定义Signal
2 public class TestCrossThreadCommEvent : Signal<string, string, TestCrossThreadCommEvent> { }

1 // Install Signals
2 Container.DeclareSignal<TestCrossThreadCommEvent>();

 1 // 启动线程
 2 tth = new Thread(() =>
 3 {
 4     while (true)
 5     {
 6         Thread.Sleep(1000);
 7         _crossThreadCommEvent.Fire("fire not in main thread", "\t so happy.");
 8         //_unityEvent.Invoke();
 9     }
10 });
11 tth.Start();
12 // UniRx-Lambda
13 _crossThreadCommEvent.AsObservable.ObserveOnMainThread(MainThreadDispatchType.Update)
14     // 使用lambda表达式是没有问题的
15     .Subscribe(tuple =>
16     {
17         Debug.Log(Thread.CurrentThread.ManagedThreadId);
18         Debug.Log(tuple.Item1 + tuple.Item2);
19         transform.RotateAround(transform.position, Vector3.up, 5f);
20     })
21     .AddTo(this);

  • 输出结果:

1

UnityEngine.Debug:Log(Object)

fire not in main thread     so happy.

UnityEngine.Debug:Log(Object)

时间: 2024-08-27 01:09:45

Zenject与UniRx结合实现跨线程通信Signal的相关文章

ZeroMq实现跨线程通信

ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void *ymq_attach (void *ctx_, int oid, void* sink_); (2)void *ymq_detach (void *ctx_, int oid); (3)void *ymq_register_timer (void *ctx_, int oid, int time

samephore()信号量跨线程通信

samephore1: #include <stdio.h> #include <stdlib.h> #include <Windows.h> char name[100] = "haihualovefang"; void main() { HANDLE hsem = CreateSemaphoreA(NULL, 0, 1, name); printf("创建成功"); char ch = getch(); //ReleaseMu

android 远程Service以及AIDL的跨进程通信

在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问题了. 转换成远程Service非常简单,只需要在注册Service的时候将他的android:process的属性制定成 :remote就可以了. 重新运行项目,你会发现,不会出现ANR了. 为什么将MyService转换成远程Service后就不会导致程序ANR了呢?这是由于,使用了远程Serv

Android中的跨进程通信方法实例及特点分析(一):AIDL Service

转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 最近有一个需求就是往程序中加入大数据的采集点,但是因为我们的Android程序包含两个进程,所以涉及到跨进程通信的问题.现将Android中的跨进程通信方式总结如下. Android中有4种跨进程通信方式,分别是利用AIDL Service.ContentProvider.Broadcast.Activity实现. 1.利用AIDL Service实现跨进程通信 这是

winform跨线程问题

1.invoke是同步线程 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading; 9 using System.Threading.Tasks; 10 using

Android Messenger 跨进程通信

如果你需要在不同进程间通信,你可以在Service中使用Messenger来实现进程中通信. 如果使用这种方式,Service中需要定义一个Handler对象(负责对客户端发送过来的Message进行响应). Messenger可以共享给client一个IBinder对象,client通过这个IBinder对象向Service发送Message,而前面提到的Handler对象是这一切的基础. 注:使用这种方式进行通信是不支持多线程的. 那就让我们来看看使用这种方式进行通信吧! 注:Service

【朝花夕拾】一篇文章搞懂Android跨进程通信

前言 只要是面试中高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Android开发高级工程师必须要跨过的一道坎.如果您还对这方面的知识还做不到如数家珍,那就和我一起来攻克它吧! 本文主要包含了如下内容: 其行文脉络大致如下,希望能加深读者对这方面内容的记忆:(1)Android基于Linux系统,所以先说系统进程相关知识和Linux IPC.(2)总结Android的IPC

【朝花夕拾】跨进程通信,你只知道AIDL,就OUT了

一.前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/11774836.html],谢谢! 提起跨进程通信,大多数人首先会想到AIDL.我们知道,用AIDL来实现跨进程通信,需要在客户端和服务端都添加上aidl文件,并在服务端的Service中实现aidl对应的接口.如果还需要服务端给客户端发送信息,还需要再添加回调相关的aidl文件,以及使用RemoteCallbackList来辅助实现该功能.在我的另外一篇文章[朝花夕拾]Android性能

Jmeter 跨线程组传递参数 之两种方法

终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直到登录接口的参数失效了,需再次发送一次登录接口,又可以多次使用其参数,下面举例子: 1.登录接口中利用 Json Path Extractor 获取到登录接口的响应参数,(怎么获取上一节讲过) 终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为