System.Reactive 6.0.1

前缀保留

需要 NuGet 2.12 或更高版本。

dotnet add package System.Reactive --version 6.0.1                
NuGet\Install-Package System.Reactive -Version 6.0.1                
此命令适用于在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的版本 Install-Package
<PackageReference Include="System.Reactive" Version="6.0.1" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中,以便引用软件包。
paket add System.Reactive --version 6.0.1                
#r "nuget: System.Reactive, 6.0.1"                
#r 指令可用于 F# Interactive 和多语言笔记本。将此内容复制到交互式工具或脚本的源代码中,以引用软件包。
// Install System.Reactive as a Cake Addin
#addin nuget:?package=System.Reactive&version=6.0.1

// Install System.Reactive as a Cake Tool
#tool nuget:?package=System.Reactive&version=6.0.1                

Rx (.NET 的响应式扩展)

Rx 允许使用可组合、声明性模型进行事件驱动的编程。

入门教程

在命令行中运行以下命令

mkdir TryRx
cd TryRx
dotnet new console
dotnet add package System.Reactive

或者,如果您已安装 Visual Studio,创建一个新的 .NET 控制台项目,然后使用 NuGet 软件包管理器将对 System.Reactive 的引用添加到项目中。

然后您可以将此代码添加到您的 Program.cs 中。这创建了一个可观察的源(ticks),每秒钟产生一个事件。它还添加了一个处理程序到该源,为每个事件在控制台写入一条消息。

using System.Reactive.Linq;

IObservable<long> ticks = Observable.Timer(
    dueTime: TimeSpan.Zero,
    period: TimeSpan.FromSeconds(1));

ticks.Subscribe(
    tick => Console.WriteLine($"Tick {tick}"));

Console.ReadLine();

示例

将现有事件源包装为 Rx IObservable<T>

如果您有一个不支持 Rx 直接但提供 .NET 事件的现有事件源,则可以使用 Observable.FromEventPattern 方法将其带入 Rx 世界。

using System.Reactive.Linq;

FileSystemWatcher fsw = new FileSystemWatcher(@"C:\temp");

IObservable<FileSystemEventArgs> changeEvents = Observable
    .FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
        h => fsw.Changed += h,
        h => fsw.Changed -= h)
    .Select(e => e.EventArgs);

fsw.EnableRaisingEvents = true;

等待不活动状态

有时在采取行动之前等待不活动期间可能很有用。例如,如果您有监控文件系统中的一个目录的代码,处理修改或添加的文件,活动频繁出现是很常见的。例如,如果用户正在将多个文件复制到您正在观察的文件夹中,将会有多个更改,并且等待这些更改停止然后一次性处理所有更改可能更有效,而不是立即尝试处理一切。

此示例定义了一个可以附加到任何源的 Rx 操作符。它会等待该源开始产生事件,然后等待它再次停止指定的时间。每次发生这种情况时,它都会报告在最后一个不活动期间发生的所有活动。

static class RxExt
{
    public static IObservable<IList<T>> Quiescent<T>(
        this IObservable<T> src,
        TimeSpan minimumInactivityPeriod,
        IScheduler scheduler)
    {
        IObservable<int> onoffs =
            from _ in src
            from delta in Observable.Return(1, scheduler).Concat(Observable.Return(-1, scheduler).Delay(minimumInactivityPeriod, scheduler))
            select delta;
        IObservable<int> outstanding = onoffs.Scan(0, (total, delta) => total + delta);
        IObservable<int> zeroCrossings = outstanding.Where(total => total == 0);
        return src.Buffer(zeroCrossings);
    }
}

(这是通过创建一个序列(onoffs)来实现的,每次活动发生时产生一个值为 1,然后在指定时间后产生一个相应的 -1。然后它使用 Scan 生成一个 outstanding 序列,它只是那些 onoffs 的累积总额。这实际上是对最近发生的事件数量的计数(其中“最近”定义为“小于 minimumInactivityPeriod 之前”。每次发生新事件时,运行总额增加 1,但是每当时限经过,它就减去 1。因此,当这个值降到 0 时,表示没有在 minimumInactivityPeriod 内发生任何事件。 zeroCrossings 序列仅选取那些 outstanding 降为 0 的事件。这导致每当有一些活动后跟随 minimumInactivityPeriod 的不活动时,zeroCrossings 就引发一个事件。最后,我们将这个结果连接到 Buffer 操作符,它将输入事件(src)切片。通过传递 zeroCrossings 源,我们告诉 Buffer 在源不活动时分配一个新切片。结果是 Quiescent 返回的源在没有活动后跟随指定的不活动期之前不做任何事情,在这一点上,它生成一个事件,报告自上次不活动期间或初次情况以来的所有源事件。)

您可以将此与前面的示例中更新的 FileSystemWatcher 一起使用。

IObservable<IList<FileSystemEventArgs>> fileActivityStopped = changeEvents
    .Quiescent(TimeSpan.FromSeconds(2), Scheduler.Default);

await fileActivityStopped.ForEachAsync(
    a => Console.WriteLine($"File changes stopped after {a.Count} changes"));

(注意:这仅使用 Changed 事件。实际应用程序可能还需要查看 FileSystemWatcherCreatedRenamedDeleted 事件。)

反馈

您可以在https://github.com/dotnet/reactive 存储库中创建问题。

产品 兼容和额外的目标框架版本。
.NET net5.0 已计算。 net5.0-windows 已计算。 net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net6.0-windows10.0.19041 兼容。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard2.0 兼容。 netstandard2.1 已计算。
.NET Framework net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 兼容。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Universal Windows Platform uap10.0.18362 兼容。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解有关 目标框架.NET标准 的更多信息。

NuGet 包 (1.4K)

显示依赖于 System.Reactive 的前 5 个 NuGet 包

下载
System.Reactive.Linq

为 .NET 的响应式扩展 (Rx) 提供的遗留接口

System.Reactive.Core

为 .NET 的响应式扩展 (Rx) 提供的遗留接口

System.Reactive.Interfaces

为 .NET 的响应式扩展 (Rx) 提供的遗留接口

System.Reactive.PlatformServices

为 .NET 的响应式扩展 (Rx) 提供的遗留接口

GraphQL.Client

用于 .NET Standard 的 GraphQL 客户端

GitHub 仓库 (282)

显示依赖于 System.Reactive 的前 5 个最受欢迎的 GitHub 仓库

仓库 星星
microsoft/PowerToys
提升 Windows 系统生产力的小工具
2dust/v2rayN
Windows 的图形界面客户端,支持 Xray 内核、v2fly 内核等
shadowsocks/shadowsocks-windows
shadowsocks 的 C# 版本
AvaloniaUI/Avalonia
使用 C# 和 XAML 开发桌面、嵌入式、移动和 WebAssembly 应用程序。最受欢迎的 .NET UI 客户端技术
BeyondDimension/SteamTools
🛠“Watt Toolkit”是一个开源跨平台的多功能 Steam 工具箱。
版本 下载 最后更新
6.0.1 971,695 5/22/2024
6.0.1-preview.1 127,212 6/14/2023
6.0.0 12,719,593 5/19/2023
6.0.0-preview.16 659 5/17/2023
6.0.0-preview.13 7,611 4/20/2023
6.0.0-preview.9 28,171 3/31/2023
6.0.0-preview.1 7,415 3/10/2023
5.0.0 67,066,479 11/10/2020
5.0.0-preview.220 17,449 10/15/2020
5.0.0-preview.16 36,773 9/26/2020
4.4.1 41,365,492 4/2/2020
4.3.2 21,104,982 12/24/2019
4.3.1 920,070 12/4/2019
4.2.2 7,995 12/24/2019
4.2.0 1,811,017 10/10/2019
4.2.0-preview.625 35,501 8/19/2019
4.2.0-preview.566 12,365 6/14/2019
4.2.0-preview.102 26,308 2/24/2019
4.2.0-preview.63 138,543 12/12/2018
4.1.6 3,766,466 8/1/2019
4.1.5 4,652,090 4/10/2019
4.1.4 30,523 4/8/2019
4.1.3 1,700,142 2/18/2019
4.1.2 9,857,477 10/10/2018
4.1.1 217,964 10/1/2018
4.1.0 1,282,643 8/13/2018
4.1.0-preview.330 1,666 8/3/2018
4.1.0-preview.84 37,020 6/18/2018
4.0.0 22,837,877 5/25/2018
4.0.0-preview.4.build.391 32,332 5/23/2018
4.0.0-preview.3.build.380 11,891 5/16/2018
4.0.0-preview.2.build.379 11,615 5/12/2018
3.1.1 9,494,379 11/21/2016
3.1.0 156,220 11/5/2016
3.1.0-rc 7,552 9/23/2016
3.0.0 2,146,325 6/27/2016