我只是想在一个字符串变量上做一个简单的事件处理程序,这样如果字符串发生变化,它就会执行一个 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/