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
<PackageReference Include="System.Reactive" Version="6.0.1" />
paket add System.Reactive --version 6.0.1
#r "nuget: System.Reactive, 6.0.1"
// 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 事件。实际应用程序可能还需要查看 FileSystemWatcher 的 Created、Renamed 和 Deleted 事件。)
反馈
您可以在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 已计算。 |
-
.NETFramework 4.7.2
- System.Threading.Tasks.Extensions (≥ 4.5.4)
-
.NETStandard 2.0
- System.Threading.Tasks.Extensions (≥ 4.5.4)
-
net6.0
- 没有依赖。
-
net6.0-windows10.0.19041
- 没有依赖。
-
UAP 10.0.18362
- System.Threading.Tasks.Extensions (≥ 4.5.4)
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 |