除了Microsoft文档之外,Microsoft Reactive(Rx)框架是否有一个很好的介绍和教程?
此外,Reactive使用常规异步编码技术解决难以解决的编程问题更容易成为一个很好的例子(使用代码)?
VS 2012使用项目类型编译时,WP 8.0如果未附加调试器,则以下代码将失败.
不知何故,如果未附加调试器,编译器优化会破坏内部代码Crash()- 请参阅代码中的注释.
在Lumia 1520(8.1)和Lumia 630(8.0)上测试.
有没有想过为什么会这样?
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
Button.Tap += (sender, args) => new A<B, string>(new B(), "string").Crash();
}
}
public class B
{
public void Foo<T>(T val) { }
}
public class A<T1, T2> where T1 : B
{
private T1 _t1;
private T2 _t2;
public A(T1 t1, T2 t2)
{
_t2 = t2;
_t1 = t1;
} …Run Code Online (Sandbox Code Playgroud) 我目前正在研究.NET的Reactive Extensions框架,我正在研究我发现的各种介绍资源(主要是http://www.introtorx.com)
我们的应用程序涉及许多检测网络帧的硬件接口,这些接口将是我的IObservables,然后我有各种组件将使用这些帧或对数据执行某种方式的转换并生成新类型的帧.例如,还有其他组件需要显示每个第n帧.我确信Rx对我们的应用程序有用,但是我正在努力处理IObserver接口的实现细节.
我读过的大多数(如果不是全部)资源都说我不应该自己实现IObservable接口,而是使用提供的函数或类之一.从我的研究看来,创建一个Subject<IBaseFrame>将为我提供我需要的东西,我会让我的单线程从硬件接口读取数据,然后调用我的Subject<IBaseFrame>实例的OnNext函数.然后,不同的IObserver组件将从该Subject接收其通知.
我的困惑来自本教程附录中的建议,其中说:
避免使用主题类型.Rx实际上是一种函数式编程范例.使用主题意味着我们现在正在管理状态,这可能会发生变异.同时处理变异状态和异步编程很难做到.此外,许多运算符(扩展方法)都经过精心编写,以确保维护订阅和序列的正确和一致的生命周期; 当你介绍科目时,你可以打破这个.如果您明确使用主题,未来版本也可能会出现明显的性能下降.
我的应用程序对性能至关重要,我显然会在进入生产代码之前测试使用Rx模式的性能; 但是我担心我正在通过使用Subject类来做违背Rx框架精神的事情,并且该框架的未来版本将损害性能.
有没有更好的方式做我想要的?无论是否有任何观察者,硬件轮询线程都将连续运行(否则HW缓冲区将备份),因此这是一个非常热门的序列.然后我需要将收到的帧传递给多个观察者.
任何建议将不胜感激.
我理解Rx的基础知识.我正在努力的是你如何在学术范例之外实际使用它?什么是常见的,简单的现实场景,其中Rx是比我们今天在.NET中更好的解决方案?
至少从.NET 4.0发布以来,微软似乎已经付出了很多努力来支持并行和异步编程,而且似乎已经出现了很多API和库.特别是最近随处可见的以下花哨的名字:
现在它们似乎都是微软的产品,它们似乎都针对.NET的异步或并行编程场景.但目前尚不清楚它们实际上是什么以及它们如何相互关联.实际上有些可能是同一件事.
简而言之,任何人都可以直接记录什么是什么?
parallel-extensions plinq task-parallel-library system.reactive
基于阅读这个问题:SubscribeOn和ObserveOn之间有什么区别
ObserveOn设置Subscribe处理程序中代码的执行位置:
stream.Subscribe(_ => { // this code here });
该SubscribeOn方法设置完成流的设置的线程.
我明白如果没有明确设置,那么使用TaskPool.
现在我的问题是,让我说我做这样的事情:
Observable.Interval(new Timespan(0, 0, 1)).Where(t => predicate(t)).SelectMany(t => lots_of(t)).ObserveOnDispatcher().Subscribe(t => some_action(t));
哪里有Where predicate和SelectMany lots_of执行,因为some_action正在上调度执行?
我们有一个客户端呼叫TIBCO EMS队列并正在连接这样的事件:
var msgConsumer = _session.CreateConsumer(responseQueue);
var response = Observable.FromEvent<EMSMessageHandler,EMSMessageEventArgs>
(h => msgConsumer.MessageHandler += h, h => msgConsumer.MessageHandler -= h)
.Where(arg => arg.Message.CorrelationID == message.MessageID);
Run Code Online (Sandbox Code Playgroud)
当我调用时,response.Subscribe(...)我得到System.ArgumentException"绑定到目标方法的错误."
我可以使它工作,Observable.FromEventPattern<EMSMessageEventArgs>(msgConsumer, "MessageHandler")但然后它将事件作为一个字符串,而不是干净.
我也IObservable<EventPattern<EMSMessageEventArgs>>不愿意IObservable<EMSMessageEventArgs>
我想了解的是:当我应该使用FromEvent过FromEventPattern?这似乎有点反复试验.
我对Reactive Extensions很感兴趣,但我找不到最新的教程.我开始使用Reactive Extensions for .NET来修复异步蓝调, 但它已经过时了.我可以找出一些变化,但我无法得到很多例子.
我在网上发现了很多文章,主要来自2009,2010,但它们也与当前版本不兼容.我对使用Windows Phone和WebClient的Rx特别感兴趣:
WebClient wc = new WebClient();
var o = Observable.FromEvent<DownloadStringCompletedEventArgs>(wc, "DownloadStringCompleted").Select(newString => newString.EventArgs.Result);
// Subscribe to the observable, and set the label text
o.Subscribe(s => myLabel.Text = s);
// Start the download
wc.DownloadStringAsync(new Uri("http://www.data.com/service"));
Run Code Online (Sandbox Code Playgroud)
不要再工作和更换FromEvent用FromEventPattern是不够的.
有人能指出我最新的资源吗?
我观看了视频,我知道了一般原则 - 即使没有人订阅也会发生热情,冷却发生在"按需".此外,Publish()将冷转换为热,Defer()将冷转换为冷.
但是,我觉得我错过了细节.以下是我想回答的一些问题: