内容简介:开源地址:学习对象 Rx.NET 和 lx.NET由于资料英文(github的介绍,demo的单元测试,自己的脑洞),自己学习和理解可能有误,希望有问题提出来,ay提前谢谢你们了。
开源地址: 前往
学习对象 Rx.NET 和 lx.NET
由于资料英文(github的介绍,demo的单元测试,自己的脑洞),自己学习和理解可能有误,希望有问题提出来,ay提前谢谢你们了。
我的测试截图,比较好理解的不啰嗦了
创建Observable对象
IObservable<Int32> source = Observable.Return(42);
产生空的 IObservable<Int32> source = Observable.Empty<Int32>();
范围:IObservable<Int32> source = Observable.Range(10, 5)
ToObservable();
System.Threading.Volatile.Write 学习地址: 查看
Enumerable.Range(1, 100) .ToObservable() .Subscribe(v => System.Threading.Volatile.Write(ref _store, v));
通过事件创建Observable对象
建立1个空的wpf项目 4.6+ 引用Reactive
<Window x:Class="WpfRxTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfRxTest" mc:Ignorable="d" WindowStartupLocation="CenterScreen" Title="www.ayjs.net" Height="450" Width="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28" Orientation="Horizontal"> <TextBlock x:Name="PageTitle" Text="搜索" VerticalAlignment="Center" FontSize="32"/> </StackPanel> <StackPanel Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <TextBox VerticalContentAlignment="Center" FontSize="16" Name="Search" Text="" HorizontalAlignment="Stretch" Height="38" Margin="10,0"/> <TextBlock Name="lblSearch" Text="搜索 - " FontSize="14" Margin="10,10"/> <TextBlock Name="lblProgress" Text="加载..." FontSize="14" Visibility="Collapsed"/> <WebBrowser Name="webBrowser1" HorizontalAlignment="Stretch" Height="469" VerticalAlignment="Stretch"/> </StackPanel> </Grid> </Window>
我自己折腾出来的。。
后台代码:
private void MainWindow_Loaded(object sender, RoutedEventArgs e) { Loaded -= MainWindow_Loaded; var Search_KeyUp = System.Reactive.Linq.Observable.FromEventPattern<KeyEventArgs>(Search, "KeyUp").Throttle(TimeSpan.FromSeconds(1)); Search_KeyUp.ObserveOn(this.Dispatcher). Subscribe(args => { if (Search.Text.Length >= 2) { lblSearch.Text = "百度百科搜索 - " + Search.Text; lblProgress.Visibility = Visibility.Visible; webBrowser1.Navigate(new Uri("https://baike.baidu.com/item/" + Search.Text)); } }); }
对事件监听,Throttle 进行延迟 搜索,ObserveOn监听在哪个线程执行,我直接界面线程
处理完后,处理结果Subscribe
效果:
文本框输入 内容, 1秒内没有输入东西,输入的东西长度大于2个字符,就会执行Subscribe中的代码
默认在另外一个线程处理结果的,处理完了,就会反馈给 Subscribe中处理。
接下来监听浏览器的,导航完成,消失加载...
var browser = Observable.FromEventPattern<NavigationEventArgs>(webBrowser1, "Navigated"); browser.ObserveOn(this.Dispatcher).Subscribe(evt => { lblProgress.Visibility = Visibility.Collapsed; } );
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
接下来看看
看一些拓展的方法,俗称 操作符
Take,Skip,Distinct和LINQ没区别,不懂的去看LINQ
using操作
Rx对于 清理 受限制资源或者非托管资源,Rx提供了using的方法,去管理这些资源的释放。
比如我们在写StreamReader,时候会用到Using{} 包起来,当然我们也可以使用Using这个来处理流
新建一个ay.txt然后尝试读文件
StringBuilder sb = new StringBuilder(); var ObservableStrings = Observable.Using<char, StreamReader>( () => new StreamReader(new FileStream(Directory.GetCurrentDirectory() + "/ay.txt", FileMode.Open)), streamReader => (streamReader.ReadToEnd().Select(str => str)).ToObservable() ); ObservableStrings.Subscribe(a => { sb.Append(a); } ); MessageBox.Show(sb.ToString());
Zip操作
LINQ中的Zip是将两个集合合并为一个新的集合,在Rx中Zip是将两个Observable对象合并为一个新的Observable对象。
var listOne = Observable.Range(0, 100); var listTwo = new String[] { "合肥", "上海", "北京", "天津", "重庆" }.ToObservable(); var numberCitys = listOne.Zip(listTwo, (num, city) => num + ":" + city); numberCitys.Subscribe(Console.WriteLine);
模仿一个移动
界面上放一个rectangle
<Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Blue" x:Name="cv"> <Rectangle Name="rec" Fill="Yellow" Width="100" Height="100" Canvas.Left="264" Canvas.Top="105" /> </Canvas>
后台注册3个事件
var mousedown = Observable.FromEventPattern<MouseButtonEventArgs>(rec, "MouseLeftButtonDown") .Select(x => x.EventArgs.GetPosition(rec)); var mouseup = Observable.FromEventPattern<MouseButtonEventArgs>(cv, "MouseLeftButtonUp"); var mousemove = Observable.FromEventPattern<MouseEventArgs>(cv, "MouseMove") .Select(x => x.EventArgs.GetPosition(cv)); var q = from start in mousedown from end in mousemove.TakeUntil(mouseup) select new { X = end.X - start.X, Y = end.Y - start.Y }; q.Subscribe(value => { Canvas.SetLeft(rec, value.X); Canvas.SetTop(rec, value.Y); });
因为你的每次移动都会导致q的改变,所以就会触发Subscribe的逻辑
TakeUntil 是等待另一个序列返回,这里等待mouseup返回
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
当然还有很多...........用法,在C#的 Task类中也是一大堆学问的方法,很值得学
推荐您阅读更多有关于“Rx,”的文章
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 写给自己的Rx编程[1]
- 254 页 PPT!这是一份写给 NLP 研究者的编程指南
- 写给自己的Kettle笔记1
- 写给自己的Kettle笔记3
- 写给自己的Kettle笔记2
- 写给自己的Kettle笔记4
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。