Winform中使用Reactivex代替BeginInvoke/Invoke来更新UI数据
首先通过Nuget安装包System.Reactive.
ReactiveX项目 Url: https://github.com/Reactive-Extensions/Rx.NET
public partial class ZSerialportForm : Form
{
private SerialPort sp;
private byte[] buffer = new byte[];
// 定义ReactiveX对象
private IScheduler scheduler = new DispatcherScheduler(Dispatcher.CurrentDispatcher);
public ZSerialportForm()
{
InitializeComponent();
} private void ZSerialportForm_Load(object sender, EventArgs e)
{
cbb_serials.Items.AddRange(SerialPort.GetPortNames());
if (cbb_serials.Items.Count > )
cbb_serials.SelectedIndex = ; btn_send.Enabled = false;
} public static string GetHexStr<T>(T[] data, int len = -, string separator = " ")
where T : IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
{
string hex = "";
int upper = data.Length;
if (len != -) upper = len;
for (int i = ; i < upper; i++)
{
hex += data[i].ToString("x2", new NumberFormatInfo());
hex += separator;
} hex = hex.TrimEnd(separator.ToCharArray());
return hex;
} /// <summary>
/// 打开串口
/// </summary>
private void btn_open_Click(object sender, EventArgs e)
{
if (btn_open.Text == "打开")
{
sp = new SerialPort(cbb_serials.Text, );
sp.ReceivedBytesThreshold = ;
sp.DataReceived += OnDataReceived;
//sp.WriteTimeout = 50;
//sp.ReadTimeout = 50;
sp.Open();
sp.DiscardInBuffer();
sp.DiscardOutBuffer();
btn_send.Enabled = true;
btn_open.Text = "关闭";
}
else if (btn_open.Text == "关闭")
{
sp.Close();
sp = null;
btn_send.Enabled = false;
btn_open.Text = "打开";
}
} /// <summary>
/// 读取串口
/// </summary>
private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (e.EventType == SerialData.Chars)
{
int len = sp.Read(buffer, , sp.BytesToRead);
string hex = GetHexStr(buffer, len);
// 使用ReactiveX的方式更新UI数据
scheduler.Schedule(() =>
{
lb_read.Items.Add(hex);
lb_read.SetSelected(lb_read.Items.Count - , true);
});
}
} /// <summary>
/// 发送数据
/// </summary>
private void btn_send_Click(object sender, EventArgs e)
{
string[] strs = tb_send.Text.Split(' ');
byte[] hexs = new byte[strs.Length];
for (int i = ; i < hexs.Length; i++)
{
hexs[i] = Byte.Parse(strs[i], NumberStyles.AllowHexSpecifier);
} try
{
sp.Write(hexs, , hexs.Length);
}
catch (Exception exception)
{
Console.WriteLine(exception);
throw;
}
} private void ZSerialportForm_FormClosed(object sender, FormClosedEventArgs e)
{
if (sp != null)
sp.Close();
}
}

Winform中使用Reactivex代替BeginInvoke/Invoke来更新UI数据的更多相关文章
- WPF Dispatcher.BeginInvoke子线程更新UI
在开发WPF应用时出现:”调用线程无法访问此对象,因为另一个线程拥有该对象.“ 是因为UI线程是WPF应用的主线程,若尝试子线程更新UI线程应使用Dispatcher.BeginInvoke()或者I ...
- C#中有关资源、BeginInvoke, Invoke和事件的事情
事情是这么来的,我开发的一个程序报了一个错误 “在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke错误”. 然后我在网上查资料,发现一个有意思的问题,文章出处为“在创建窗口 ...
- winform中使用ReportViewer的时候,找不到报表数据面板.
最近在做winform的报表项目,看人家教程里都有报表数据面板,可我的怎么都找不到,我的是VS2012,最后终于找到,首先必须在报表设计TAB上(选中它),然后选择视图->报表数据
- WPF 中的 经典的ModelView 通知页面更新 UI
view model ------------------------------------------------------------------------------ using HPCo ...
- winform中如何在多线程中更新UI控件--ListView实时显示执行信息
1.在winform中,所有对UI的操作,都得回到UI线程(主线程)上来,才不会报错 线程间操作无效: 从不是创建控件的线程访问它. 2.在winform中,允许通过Control.invoke对控件 ...
- [转载]Winform中Control的Invoke与BeginInvoke方法
转自http://www.cppblog.com/baby-fly/archive/2010/04/01/111245.html 一.为什么 Control类提供了 Invoke和 BeginInvo ...
- WinForm/Silverlight多线程编程中如何更新UI控件的值
单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...
- .net开发笔记(十八) winform中的等待框
winform中很多任务是需要在后台线程(或类似)中完成的,也就是说,经常容易涉及到UI界面与后台工作线程之间的交互.比如UI界面控制后台工作的执行(启动.暂停.停止等),后台工作进度在UI界面上的显 ...
- 如何跨线程访问Winform中的UI元素
如何跨线程访问Winform中的UI元素 假如制作一个Socket聊天应用程序,很可能会用到多线程: 例如为Receive方法开辟单独一个线程,例如为Receive方法开辟单独一个线程(后台运行的线程 ...
随机推荐
- 关于Spring注入参数到static静态参数失败问题处理。解决Autowired annotation is not supported on static fields的问题
直接贴代码 把注入参数的注解加到set方法上面去即可. 因为这是一个工具类用到的config,所以一开始没有加@Component,还是依然为空,加上之后就正常能注入了
- C#设计模式学习笔记:(1)单例模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8250985.html,记录一下学习过程以备后续查用. 一.引言 设计模式的分类: 1)依目的: 创建型(Cr ...
- gulp常用插件之gulp-replace使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-replace这是一款gulp3的字符串替换插件. 更多使用文档请点击访问gulp-replace工具官网. 安装 一键安装不多解释 n ...
- Pots POJ - 3414【状态转移bfs+回溯】
典型的倒水问题: 即把两个水杯的每种状态视为bfs图中的点,如果两种状态可以转化,即可认为二者之间可以连一条边. 有3种倒水的方法,对应2个杯子,共有6种可能的状态转移方式.即相当于图中想走的方法有6 ...
- <转载> 撤销 git reset 操作
https://blog.csdn.net/mhlghy/article/details/84786497
- pcl库卸载再重装
系统版本:ubuntu 16.04 sudo rm -r /usr/include/pcl-1.7 /usr/share/pcl /usr/bin/pcl* /usr/lib/libpcl* sudo ...
- H5_0011:JS动态创建html并设置CSS属性
1,创建html文本,并设置指定css样式 r = function(e) { var t = document.createElement("div"); t.innerHTML ...
- 03_TypeScript函数
1.函数的定义 es5定义函数的方法 //函数声明法 function run(){ return 'run'; } //函数表达式 var run = function(){ return 'run ...
- 使用vim打开文件的16进制形式,编辑和全文替换
1.先用vim打开文件的二进制形式,如果不以二进制可能会产生转换错误. vim -b file-to-open.dat 2.用xxd把文件转换成十六进制格式 :%!xxd 现在就可以对待普通文本一样查 ...
- Vue中axios有关请求头的几点小结
在Vue前端中向后端发起http请求会有着两种写法:一种是在vue文件中直接导入axios模板,另外一种是使用Vue的属性$http. 1.在第一种方式中,在同一个工程中所添加的vue文件直接使用ax ...