101 Rx示例

时间:2009-11-20 19:34:38

标签: c# .net system.reactive reactive-programming

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

简短问题:

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

长时间散布着隐藏的问题:

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

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

我个人现在正在试一试,但哇有一些疯狂的概念......只是为了让方法名称如 物化 Zip 让我想起 Teleporters 以及回到未来的内容。

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

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

7 个答案:

答案 0 :(得分:27)

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

101 Rx Samples on the Rx wiki

答案 1 :(得分:12)

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

A WPF Drawing Demo

这是源代码。

//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

希望这有帮助

答案 2 :(得分:7)

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

答案 3 :(得分:5)

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

答案 4 :(得分:4)

这是我对drag & drop sample by Wes Dyer的变体,对于Windows窗体(我可能会使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));
    }  

答案 5 :(得分:3)

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

答案 6 :(得分:1)

Github上的 Stock Viewer 示例 enter image description here

  1. StreamProvider从服务器提取数据并生成Rx.NET IObservable流。
  2. StreamAggregator聚合所有IObservable流并将结果复制到中央处理线程中。
  3. 视图过滤单个流并将结果复制到自己的线程中以供显示。
  4. 所有StreamProviders,StreamAggregate和Views都在自己的线程中运行。这也是现实世界库存查看应用程序的典型线程模型。

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