首先通过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数据的更多相关文章

  1. WPF Dispatcher.BeginInvoke子线程更新UI

    在开发WPF应用时出现:”调用线程无法访问此对象,因为另一个线程拥有该对象.“ 是因为UI线程是WPF应用的主线程,若尝试子线程更新UI线程应使用Dispatcher.BeginInvoke()或者I ...

  2. C#中有关资源、BeginInvoke, Invoke和事件的事情

    事情是这么来的,我开发的一个程序报了一个错误 “在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke错误”. 然后我在网上查资料,发现一个有意思的问题,文章出处为“在创建窗口 ...

  3. winform中使用ReportViewer的时候,找不到报表数据面板.

    最近在做winform的报表项目,看人家教程里都有报表数据面板,可我的怎么都找不到,我的是VS2012,最后终于找到,首先必须在报表设计TAB上(选中它),然后选择视图->报表数据

  4. WPF 中的 经典的ModelView 通知页面更新 UI

    view model ------------------------------------------------------------------------------ using HPCo ...

  5. winform中如何在多线程中更新UI控件--ListView实时显示执行信息

    1.在winform中,所有对UI的操作,都得回到UI线程(主线程)上来,才不会报错 线程间操作无效: 从不是创建控件的线程访问它. 2.在winform中,允许通过Control.invoke对控件 ...

  6. [转载]Winform中Control的Invoke与BeginInvoke方法

    转自http://www.cppblog.com/baby-fly/archive/2010/04/01/111245.html 一.为什么 Control类提供了 Invoke和 BeginInvo ...

  7. WinForm/Silverlight多线程编程中如何更新UI控件的值

    单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...

  8. .net开发笔记(十八) winform中的等待框

    winform中很多任务是需要在后台线程(或类似)中完成的,也就是说,经常容易涉及到UI界面与后台工作线程之间的交互.比如UI界面控制后台工作的执行(启动.暂停.停止等),后台工作进度在UI界面上的显 ...

  9. 如何跨线程访问Winform中的UI元素

    如何跨线程访问Winform中的UI元素 假如制作一个Socket聊天应用程序,很可能会用到多线程: 例如为Receive方法开辟单独一个线程,例如为Receive方法开辟单独一个线程(后台运行的线程 ...

随机推荐

  1. 关于FrameLayout中覆盖的问题

    FrameLayout中xml文件中写在下方的控件会默认覆盖上方的控件,如图,我准备实现如下效果: 这时recyclerview就要写在前面 如果recyclerview写在下面就会覆盖掉我linea ...

  2. 论文阅读笔记(十四)【AAAI2020】:Appearance and Motion Enhancement for Video-based Person Re-identification

    Introduction 本文的贡献:提出了基于视频的行人重识别模型:Appearance and Motion Enhancement Model(AMEM).该模型对两类信息进行提取:提出了App ...

  3. Wannafly Winter Camp 2020 Day 6G 单调栈 - 贪心

    对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 ...

  4. 【Pyecharts可视化分享】杭州步行热门路线等~

    前言 本文包括内容如下: 杭州步行热门路线 渐变效果散点图 均是Echarts官方提供等示例,本文将会通过Pyecharts来进行实现. 杭州步行热门路线 因为代码中需要调用百度地图,所以开始之前你需 ...

  5. python三级菜单制作 day4

    需求:可依次选择进入各子菜单可从任意一层往回退到上一层可从任意一层退出程序所需新知识点:列表.字典 数据结构: menu = {    '北京':{        '海淀':{            ...

  6. java通过递归统计文件大小

    思路就是通过文件的遍历,对一个文件夹中的非目录文件进行大小统计,并对其中目录文件进行相同的遍历操作,代码如下: package word; import java.io.File; import ja ...

  7. jQuery笔记(五)jQuery表单验证

    前言 上次我们说完jQuery中的动画之后,我们再来看一种jQuery在Web网页应用最为广泛的一种形式,这就是jQuery对表单的操作,通过jQuery对表单的操作,可以有效的提高用户体验.在此之前 ...

  8. thinkphp 5.0 后台数据修改

    html代码 <table class="easyui-datagrid" data-options="singleSelect:true,collapsible: ...

  9. 【29】带你了解计算机视觉(Computer vision)

    计算机视觉(Computer vision) 计算机视觉是一个飞速发展的一个领域,这多亏了深度学习. 深度学习与计算机视觉可以帮助汽车,查明周围的行人和汽车,并帮助汽车避开它们. 还使得人脸识别技术变 ...

  10. kali2019.4试用记录

    问题一:中文乱码 https://blog.csdn.net/dust_hk/article/details/103299136 参考以上博文即可解决: 1.设置locales. dpkg-recon ...