c# - Observable<string> 更新事件?

标签 c# .net linq system.reactive

我只是想在一个字符串变量上做一个简单的事件处理程序,这样如果字符串发生变化,它就会执行一个 Console.WriteLine(使用来自 MS (Rx) 的新 Reactive 库)

我遇到的问题是,当我实例化类时它会显示第一位(“RandomGuid:我的?”),但在那之后,我之后更改的所有内容都不会向控制台吐出任何内容。

我浏览了 MS 网站上的 HOL,但它直接从定义 Observable 到从文本框中读取值,而我只想观察字符串是否已更改。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MynahBirds
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Minah> minahs = new List<Minah>();

            for (int i = 0; i < 10; i++) {
                minahs.Add(new Minah());
            }

            foreach (var item in minahs) {
                item.peers = minahs;
            }

            minahs.ForEach(m => m.s = Observable.Return<string>("Mine"));
            minahs.ForEach(m => m.s = Observable.Return<string>("Whee"));
            minahs.ForEach(m => m.s = Observable.Return<string>("Argh"));

            Console.ReadLine();
        }
    }
    class Minah
    {
        Guid Id;
        public List<Minah> peers;
        IDisposable subscription;

        public IObservable<string> s = Observable.Return<string>("Mine?");

        public Minah()
        {
            try {
                this.Id = Guid.NewGuid();

                subscription = s.Subscribe((string a) => {
                    Console.WriteLine("{0} : {1}", this.Id, a);
                },
                (Exception ex) => {
                    Console.WriteLine("Error {0} hit", ex.ToString());
                },
                () => { });

            } catch (Exception ex) {
                Console.WriteLine(ex.ToString());
                Console.ReadLine();
                throw;
            }
        }
    }
}

最佳答案

当您分配给 m.s 时在ForEach您没有使用新值更新现有的可观察对象(您已订阅),而是创建新的可观察对象,这就是 Observable.Return做。下面的代码可以满足您的期望:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MynahBirds
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Minah> minahs = new List<Minah>();

            for (int i = 0; i < 10; i++)
            {
                minahs.Add(new Minah());
            }

            foreach (var item in minahs)
            {
                item.peers = minahs;
            }

            minahs.ForEach(m => m.s.OnNext("Mine"));
            minahs.ForEach(m => m.s.OnNext("Whee"));
            minahs.ForEach(m => m.s.OnNext("Argh"));

            Console.ReadLine();
        }
    }
    class Minah
    {
        Guid Id;
        public List<Minah> peers;
        IDisposable subscription;

        public ISubject<string> s = new Subject<string>();

        public Minah()
        {
            try
            {
                this.Id = Guid.NewGuid();

                subscription = s.Subscribe((string a) =>
                {
                    Console.WriteLine("{0} : {1}", this.Id, a);
                },
                (Exception ex) =>
                {
                    Console.WriteLine("Error {0} hit", ex.ToString());
                },
                () => { });

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                Console.ReadLine();
                throw;
            }
        }
    }
}

而不是使用 Observable.Return<T>() ,这里我使用了一个 Subject ,它既是观察者又是可观察序列。它用它观察到的每个值更新它的所有订阅。所以当OnNext在主题上被调用,它被转发到所有订阅。

如果您需要初始值 ( Mine? ),您可以添加 s.OnNext("Mine?");Minah 的末尾构造函数。

关于c# - Observable<string> 更新事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3908827/

相关文章:

c# - System.InvalidOperationException: 'RegisterSessionNotification has to be called from an MTA-Thread.'

c# - 减少 WMI 查询执行时间

.net - 64 位版本的 Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader 程序集

c# - LINQ 从 4 个 IEnumerable 列表中选择不同的

c# - 我的 LINQ to XML 代码中的空引用异常

c# - 异步与多线程

c# - 在 Web api 和身份 C# 中获取无效的 token 重置密码时间?

c# - 为什么我的 c# Windows 服务在没有任何消息写入应用程序事件日志的情况下停止运行?

.net - MVC3 模型 DisplayFormat 和 JSON

c# - linq to sql 查询帮助