RX.Net 第二章 hello Word

本章提供了一个简单而强大的例子,你可能在过去做过(或者将来可能会做),并以两种方式解决它:传统的事件风格和Rx风格的事件处理流。

  1. net中编写事件驱动的应用程序非常直观,但在资源清理和代码可读性方面需要注意。

  2. 要使用Rx库,需要安装Rx包。大多数情况下,您将安装系统。反应计划。

  3. 您可以在任何类型的应用程序中使用Rx WPF桌面客户端,asp.net网站或简单的控制台应用程序等。

  4. 传统的。net事件可以转换为可观察对象。

  5. Rx允许您在可观察对象之上编写查询表达式。

  6. Rx提供了许多查询操作符,例如使用Where操作符进行过滤,使用Select操作符进行转换等等。

当然,这还没有结束。这只是你旅程的开始。要在应用程序中正确使用Rx并使用所有丰富的操作符,您需要学习它们以及将它们组合在一起的技术,这就是本书的全部内容。

在下一章中,你将学习函数式的思维方式,它与。net内部的核心概念一起,使Rx得以发展

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Channels;
using System.Threading.Tasks;

namespace ReactiveDemo;


class StockTick
{
    public string Name { get; set; }
    public float Price { get; set; }
}

class StockTicker
{
    public event EventHandler<StockTick> StockTick;

    public void Trigger(StockTick stockTick)
    {
        StockTick?.Invoke(this, stockTick);
    }
}

struct DrasticChange
{
    public DateTime TimeSpan { get; set; }
    public string Name { get; set; }
    public float ChangeRatio { get; set; }
    public float OldPrice { get; set; }
    public float NewPrice { get; set; }
}



class StockReactive
{
    public static void Run()
    {
        var maxChangeRatio = 0.3f;
        var stockTicker = new StockTicker();

        //获取事件源
        var ticks = Observable.FromEventPattern<EventHandler<StockTick>, StockTick>(
                               h => stockTicker.StockTick += h,
                               h => stockTicker.StockTick -= h)
                    .Select(t => t.EventArgs)
                    
                    ;

        //模拟筛选股票价格波动,(有个漏洞,若果tickPair[0].Price = 0 怎么办)
        var ticksGroups = from tick in ticks
                          group tick by tick.Name into company
                          from tickPair in company.Buffer(2, 1)
                          let changeRatio = DiffPercentage(tickPair[1].Price, tickPair[0].Price)
                          where changeRatio > maxChangeRatio
                          select new DrasticChange
                          {
                              TimeSpan = DateTime.Now,
                              Name = company.Key,
                              ChangeRatio = changeRatio,
                              OldPrice = tickPair[0].Price,
                              NewPrice = tickPair[1].Price
                          };


        var subescribeer = ticksGroups.Subscribe(t => Console.WriteLine($"收到信息:{JsonSerializer.Serialize(t)}"));

        //制造数据
        for (int i = 0; i < 100; i++)
        {
            var stockTick = new StockTick()
            {
                Name = $"{(i % 3)}Name",
                Price = i * DateTime.Now.Second,
            };
            stockTicker.Trigger(stockTick);
        }
        subescribeer.Dispose();

    }

    static float DiffPercentage(float f1, float f2)
    {
        if (f1 == 0)
        {
            f1 = 0.0000000000001f;
        }
        return Math.Abs((f1 - f2) / f1);
    }
}
相关推荐
追逐时光者几秒前
分享 5 种 .NET 桌面应用程序自动更新解决方案
.net
light blue bird4 小时前
原生控件GDI完成作业协同界面
jvm·数据库·.net·winform·gdi+界面
CSharp精选营4 小时前
值类型与引用类型:别再只背“栈和堆”了,看这 4 个实际影响
c#·.net·值类型·引用类型·栈和堆·编程指南
AndrewMe82117 小时前
detailed-docx:一个能保住格式的 Word 文档操作库
开发语言·python·word
步步为营DotNet8 小时前
深入剖析.NET 11 中 Microsoft.Extensions.AI 在 AI 驱动后端开发的进阶应用
人工智能·microsoft·.net
热爱生活的五柒10 小时前
如何自动更新zotero?正文调换章节顺序后参考文献错乱无法刷新怎么办?
word·zotero·参考文献
林鸿群13 小时前
竞彩网全栈项目实战:克隆与重构,从零构建 Vue3 + .NET 9 现代彩票网站
重构·.net
荔枝吻1 天前
【系列合集目录】.net开发选型记录
.net
我是唐青枫1 天前
C#.NET ConcurrentStack<T> 深入解析:无锁栈原理、LIFO 语义与使用边界
网络·c#·.net
荔枝吻1 天前
【AI总结】C#与.NET:一段跨越20年的命名纠葛与共生传奇
开发语言·c#·.net