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方法开辟单独一个线程(后台运行的线程 ...
随机推荐
- Jacoco收集单元测试、集成测试和系统功能测试覆盖率
Jacoco收集单元测试.集成测试和系统功能测试覆盖率 2020-02-27 目录 1 安装版本2 被测系统代码示例3 收集单元测试覆盖率4 收集集成和功能测试覆盖率 代码覆盖率可在单元测试.系统测 ...
- 【NLP】暑假课作业1 - 中文分词(前向匹配算法实现)
作业任务: 使用98年人民日报语料库进行中文分词训练及测试. 作业输入: 98年人民日报语料库(1998-01-105-带音.txt),用80%的数据作为训练集,20%的数据作为验证集. 运行环境: ...
- python报错bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml.
qpython运行 原代码: soup = BeautifulSoup(r.text,'lxml') 报错:bs4.FeatureNotFound: Couldn't find a tree b ...
- STL-优先级队列-priority_queue
头文件是<queue> 操作很简单 #include <iostream> #include <cstdio> #include <queue> usi ...
- 2019版本kali linux-3 系统安装与基本调试
本次的实验环境是: kali linux -3 kali linux 全版本地址: http://old.kali.org/kali-images/ 楼主的主系统是:kali linux 如果想学好 ...
- JS:获取标签的6个方法+获取html+获取body
JS 获取标签的方法 通过class: document.getElementsByClassName('class名');返回数组通过name: document.getElementsByName ...
- 亚马逊云推出基于机器学习的企业搜索服务Kendra,剑指微软
近日,在AWS re:Invent全球大会上,亚马逊发布了五项新的基于机器学习的人工智能 (AI) 服务. 这五项服务包括机器学习驱动的企业搜索.代码审核与分析.欺诈检测.医疗转录和 AI 预测的人工 ...
- F. Moving Points
https://codeforces.com/contest/1311/problem/F 这是一道线段树类型的题: 可以用权值线段树或者树状数组来解: 所以,我们可以分为两部分,第一部分是计算出到当 ...
- C#中怎样在ToolStripMenuItem下再添加子级菜单
场景 在右键菜单ContextMenuStrip下添加子菜单选项可以通过 ContextMenuStrip menuStrip ToolStripMenuItem mnuChartOption = n ...
- 第四十九篇 入门机器学习——数据归一化(Feature Scaling)
No.1. 数据归一化的目的 数据归一化的目的,就是将数据的所有特征都映射到同一尺度上,这样可以避免由于量纲的不同使数据的某些特征形成主导作用. No.2. 数据归一化的方法 数据归一化的方法主要 ...