c# – Reactive:试图了解Subject如何工作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Reactive:试图了解Subject如何工作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2647字,纯文字阅读大概需要4分钟。
内容图文
试图理解主题< T>,ReplaySubject< T>和其他工作.这是一个例子:
(主题是观察者和观察者)
public IObservable<int> CreateObservable()
{
Subject<int> subj = new Subject<int>(); // case 1
ReplaySubject<int> subj = new ReplaySubject<int>(); // case 2
Random rnd = new Random();
int maxValue = rnd.Next(20);
Trace.TraceInformation("Max value is: " + maxValue.ToString());
subj.OnNext(-1); // specific value
for(int iCounter = 0; iCounter < maxValue; iCounter++)
{
Trace.TraceInformation("Value: " + iCounter.ToString() + " is about to publish");
subj.OnNext(iCounter);
}
Trace.TraceInformation("Publish complete");
subj.OnComplete();
return subj;
}
public void Main()
{
//
// First subscription
CreateObservable()
.Subscribe(
onNext: (x)=>{
Trace.TraceInformation("X is: " + x.ToString());
});
//
// Second subscribe
CreateObservable()
.Subscribe(
onNext: (x2)=>{
Trace.TraceInformation("X2 is: " + x.ToString());
});
案例1:奇怪的情况是 – 当我使用Subject< T>没有订阅(???) – 我从来没有看到“X是:”文本 – 我只看到“值是:”和“最大值是”…为什么主题< T>不会将价值推向订阅?
案例2:如果我使用ReplaySubject< T> – 我确实看到了Subscription中的值,但我无法将Defer选项应用于任何内容.不是主题而不是Observable ….所以每个订阅都会收到不同的值,因为CreateObservable函数是冷可观察的.延迟在哪里?
解决方法:
您需要注意何时执行代码.
在“案例1”中,当您使用主题< T>时,您会注意到对OnNext& ;;的所有调用.在CreateObservable方法返回observable之前完成OnCompleted.由于您使用的是主题< T>这意味着任何后续订阅都会错过所有的值,所以你应该期望得到你所得到的 – 没有.
您必须延迟对主题的操作,直到您订阅了观察者.要使用Create方法执行此操作.这是如何做:
public IObservable<int> CreateObservable()
{
return Observable.Create<int>(o =>
{
var subj = new Subject<int>();
var disposable = subj.Subscribe(o);
var rnd = new Random();
var maxValue = rnd.Next(20);
subj.OnNext(-1);
for(int iCounter = 0; iCounter < maxValue; iCounter++)
{
subj.OnNext(iCounter);
}
subj.OnCompleted();
return disposable;
});
}
我删除了所有跟踪代码的简洁性.
所以现在,对于每个订阅者,您在Create方法中获得了新的代码执行,现在您将从内部Subject< T>获取值.
使用Create方法通常是创建从方法返回的observable的正确方法.
或者,您可以使用ReplaySubject< T>并避免使用Create方法.然而,由于许多原因,这没有吸引力.它强制在创建时计算整个序列.这给你一个冷的观察,你可以更高效地生产,而不使用重播主题.
现在,除此之外,你应该尽量避免使用主题.一般规则是,如果你正在使用一个主题,那么你做错了什么. CreateObservable方法可以更好地编写为:
public IObservable<int> CreateObservable()
{
return Observable.Create<int>(o =>
{
var rnd = new Random();
var maxValue = rnd.Next(20);
return Observable.Range(-1, maxValue + 1).Subscribe(o);
});
}
根本不需要任何主题.
如果这有帮助,请告诉我.
内容总结
以上是互联网集市为您收集整理的c# – Reactive:试图了解Subject如何工作全部内容,希望文章能够帮你解决c# – Reactive:试图了解Subject如何工作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。