101 Rx示例

问题描述 投票:38回答:7

编辑:感谢wiki的链接,我认为自从它已经开始,它更容易去那里检查。不过这里的问题也很好,所以不在msdn论坛周围的人会了解wiki及其位置。

简短问题:

你有一个Rx代码示例,可以帮助人们更好地理解它吗?

漫长的漫无边际的问题:

现在已经发布了Rx框架,我认为我们中的许多人都有兴趣获取这些内容并尝试它们。可悲的是,实际上并没有很多例子(经过详尽的搜索后,我几乎确信Rx只是为了在wpf应用上轻松实现)。

我不记得我读到或听过的确切位置(我一直在看很多博客和视频),Rx团队似乎对101系列感兴趣...当他们有足够的时间去做...对于那些想要了解它并且现在玩它的人来说非常糟糕(我的意思是,当一个像这样的新技术出现时,自我尊重的开发人员不会觉得自己是一个带有新玩具的孩子) 。

我个人现在一直在尝试,但哇有一些疯狂的概念......只是让像Materialise和Zip这样的方法让我想起了Teleporters和Back to the Future的东西。

所以,我认为如果那些有更多理解的人,帮助建立一个例子的集合,从基本用法到更复杂的东西,并且几乎涵盖了所有方法及其用途的101 Linq示例,那将是很好的。一种实用的方法(也许还有一点理论,特别是因为这些概念可能需要它)

我认为MS开发人员花时间给我们这样的材料很棒,但我也认为这个社区足以开始构建我们自己的材料,不是吗?

c# .net system.reactive reactive-programming
7个回答
27
投票

几天前我实际上有类似的想法。我们在Rx MSDN论坛上发布了我们自己的“101 Rx Samples”,但我们已将其转换为Wiki格式。请随时过来添加您自己的样品!

101 Rx Samples on the Rx wiki


13
投票

首先 - 这是一个简单的绘图应用程序,因此当用户拖动时,我们从初始鼠标向下位置到当前位置绘制一条红线,并在当前位置绘制一个蓝点。这是我上周对Rx进行攻击的结果

这是源代码。

//A draw on drag method to perform the draw
void DrawOnDrag(Canvas e)
        {

            //Get the initial position and dragged points using LINQ to Events
            var mouseDragPoints = from md in e.GetMouseDown()
                                  let startpos=md.EventArgs.GetPosition(e)
                                  from mm in e.GetMouseMove().Until(e.GetMouseUp())
                                  select new
                                  {
                                      StartPos = startpos,
                                      CurrentPos = mm.EventArgs.GetPosition(e),
                                  };


            //Subscribe and draw a line from start position to current position
            mouseDragPoints.Subscribe
                (item =>
                {
                    e.Children.Add(new Line()
                    {
                        Stroke = Brushes.Red,
                        X1 = item.StartPos.X,
                        X2 = item.CurrentPos.X,
                        Y1 = item.StartPos.Y,
                        Y2 = item.CurrentPos.Y
                    });

                    var ellipse = new Ellipse()
                    {
                        Stroke = Brushes.Blue,
                        StrokeThickness = 10,
                        Fill = Brushes.Blue
                    };
                    Canvas.SetLeft(ellipse, item.CurrentPos.X);
                    Canvas.SetTop(ellipse, item.CurrentPos.Y);
                    e.Children.Add(ellipse);
                }
                );
        }

Read my post with further explanation hereDownload the source code here

希望这可以帮助


8
投票

另一个有用的资源可能是Reactive Extensions (Rx) Koans:55个渐进式示例,可以帮助您学习Rx


5
投票

我正在读http://www.introtorx.com,顾名思义似乎是一个简洁的介绍。似乎有很多(非常基本的)示例,一步一步,主要是使用控制台打印出来的东西。


4
投票

这是我对drag & drop sample by Wes Dyer的变体,对于Windows Forms(我可能会使EnableDragging成为一种扩展方法):

    public Form2()
    {
        InitializeComponent();

        EnableDragging(pictureBox1);
        EnableDragging(button1);
        EnableDragging(this);
    }

    private void EnableDragging(Control c)
    {
        // Long way, but strongly typed.
        var downs = from down in Observable.FromEvent<MouseEventHandler, MouseEventArgs>(
                        eh => new MouseEventHandler(eh), 
                        eh => c.MouseDown += eh,  
                        eh => c.MouseDown -= eh)
                    select new { down.EventArgs.X, down.EventArgs.Y };

        // Short way.
        var moves = from move in Observable.FromEvent<MouseEventArgs>(c, "MouseMove")
                    select new { move.EventArgs.X, move.EventArgs.Y };

        var ups = Observable.FromEvent<MouseEventArgs>(c, "MouseUp");

        var drags = from down in downs
                    from move in moves.TakeUntil(ups)
                    select new Point { X = move.X - down.X, Y = move.Y - down.Y };

        drags.Subscribe(drag => c.SetBounds(c.Location.X + drag.X, c.Location.Y + drag.Y, 0, 0, BoundsSpecified.Location));
    }  

3
投票

有点晚了,但是如果有人在这个问题上遇到新的问题,http://rxmarbles.com/提供了一种非常好的方法来可视化运营商。


1
投票

还有一个关于Github Stock Viewerenter image description here例子

  1. StreamProvider从服务器提取数据并生成Rx.NET IObservable流。
  2. StreamAggregator聚合所有IObservable流并将结果复制到中央处理线程中。
  3. 视图过滤单个流并将结果复制到它们自己的线程中以供显示。

所有StreamProviders,StreamAggregate和Views都在自己的线程中运行。这也是现实世界库存查看应用程序的典型线程模型。

此示例也可以是WPF DataGrid的简单性能测试框架。它计算滴答/秒处理并在视图上显示。

© www.soinside.com 2019 - 2024. All rights reserved.