首先通过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. Java连载75-StringBuffer和StringBuilder

    一.StringBuffer和StringBuilder 1.StringBuffer是什么? 答:是一个字符串缓冲区,工作原理:预先在内存中申请一块空间以容纳字符序列,如果预留的空间,则进行自动扩容 ...

  2. windows10使用任务计划提醒自己

    转载自:https://www.cnblogs.com/yourstars/p/6505991.html 利用Win10计划任务 + 弹窗,提醒你自己 步骤: 1.打开Win10控制面板 -> ...

  3. Spark学习之路 (五)Spark伪分布式安装[转]

    JDK的安装 JDK使用root用户安装 上传安装包并解压 [root@hadoop1 soft]# tar -zxvf jdk-8u73-linux-x64.tar.gz -C /usr/local ...

  4. [SDOI2010]粟粟的书架 [主席树]

    [SDOI2010]粟粟的书架 考虑暴力怎么做 显然是提取出来 (x2-x1+1)*(y2-y1+1) 个数字拿出来 然后从大到小排序 然后就可以按次取数了- 然而接下来看数据范围 \(50\%\ r ...

  5. 分布式集群HA模式部署

    一:HDFS系统架构 (一)利用secondary node备份实现数据可靠性 (二)问题:NameNode的可用性不高,当NameNode节点宕机,则服务终止 二:HA架构---提高NameNode ...

  6. Android 基础知识 -- Linux环境搭建

    Android 开发工具下载网站:http://www.androiddevtools.cn/ 1 JDK 1.1 下载JDK,解压后放到/usr/lib/jvm/目录 sudo mv jdk1.7. ...

  7. 基于Python接口自动化测试框架(初级篇)附源码

    引言 很多人都知道,目前市场上很多自动化测试工具,比如:Jmeter,Postman,TestLink等,还有一些自动化测试平台,那为啥还要开发接口自动化测试框架呢?相同之处就不说了,先说一下工具的局 ...

  8. java学习笔记之集合—ArrayList源码解析

    1.ArrayList简介 ArrayList是一个数组队列,与java中的数组的容量固定不同,它可以动态的实现容量的增涨.所以ArrayList也叫动态数组.当我们知道有多少个数据元素的时候,我们用 ...

  9. python3相关

    with用法 with A as B: 语句 调用( A返回的类) 的__enter__方法 将该方法返回值赋予B, 执行完with语句块后, 调用类的__exit__方法

  10. 怎么压缩PPT大小?

    PPT体积过大有几个原因: 1.母版内版式过多.解决方法:①点击“视图”选项卡下的“幻灯片母版”:②删除左边没必要的版式. 2.图片质量太大.解决方法:①选中任意一张图片:②点击“图片工具”的“格式” ...