内容简介:开源地址:学习对象 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
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Big Java Late Objects
Horstmann, Cay S. / 2012-2 / 896.00元
The introductory programming course is difficult. Many students fail to succeed or have trouble in the course because they don't understand the material and do not practice programming sufficiently. ......一起来看看 《Big Java Late Objects》 这本书的介绍吧!