神奇了今天做串口通讯,发现串口接受线程里的数据可以直接刷到UI上了

zmidl 2018-09-07 04:07:25
项目基于wpf的mvvm 模式,后台有个 Text属性绑定到UI上的文本框
然后

var name = SerialPort.GetPortNames()[0];
this.SerialPort = new SerialPort { PortName = name, DataBits = 8, BaudRate = 9600, Parity = Parity.None, StopBits = StopBits.One };
this.SerialPort.DataReceived += (s, e) =>
{
this.TestText = ((SerialPort)s).ReadExisting();
};
this.SerialPort.Open();

同样是mvvm 我记得以前刷UI还是需要通过 InvokeAsync或者 BeginInvoke 完成子线程刷新UI线程的。今天忘记用委托跨线程访问了但是文本框刷新了串口数据。这是啥情况啊?了解的朋友指点下。
...全文
383 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fd34gs3yf 2018-12-06
  • 打赏
  • 举报
回复
引用 3 楼 zmidl 的回复:
[quote=引用 9 楼 war3tr 的回复:] [quote=引用 6 楼 zmidl 的回复:] [quote=引用 2 楼 war3tr 的回复:] 根本不需要找原因,老老实实的用委托,否则有你哭的时候
是的呀 就是发现个问题想找到答案啊,你只知其然,不知所以然等于没有学透。[/quote] 不要用“你”,用“我”,不想多给你讲道理,这年头有人回复你,你就庆幸吧 .NET 1.0之后的跨线程操作控件默认都会抛出异常,没有忽然又可以了之类的说法 this.TestText显然是自定义属性,在这里面进行了委托呢,或者修改了允许跨线程操作的配置呢[/quote] 你不懂就不要装懂了,没意思。。。[/quote] 你这caibi问个问题脾气还不小呢
zmidl 2018-09-19
  • 打赏
  • 举报
回复
引用 9 楼 war3tr 的回复:
[quote=引用 6 楼 zmidl 的回复:]
[quote=引用 2 楼 war3tr 的回复:]
根本不需要找原因,老老实实的用委托,否则有你哭的时候

是的呀 就是发现个问题想找到答案啊,你只知其然,不知所以然等于没有学透。[/quote]
不要用“你”,用“我”,不想多给你讲道理,这年头有人回复你,你就庆幸吧
.NET 1.0之后的跨线程操作控件默认都会抛出异常,没有忽然又可以了之类的说法
this.TestText显然是自定义属性,在这里面进行了委托呢,或者修改了允许跨线程操作的配置呢[/quote]
你不懂就不要装懂了,没意思。。。
xuzuning 2018-09-10
  • 打赏
  • 举报
回复
但是
this.SerialPort.DataReceived += (s, e) =>
{
this.TestText = ((SerialPort)s).ReadExisting();
};
并非是多线程设计,自然就不在你那个原则之列了
zmidl 2018-09-10
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
只要不是自行启动的子线程,访问 UI 就无需 Invoke
这并没有什么可奇怪的

按照C#线程安全的设计原则,非UI线程一定要通过委托代理访问UI线程的呀。再说了以前这样做就会报错的呀。
zmidl 2018-09-10
  • 打赏
  • 举报
回复
引用 2 楼 war3tr 的回复:
根本不需要找原因,老老实实的用委托,否则有你哭的时候

是的呀 就是发现个问题想找到答案啊,你只知其然,不知所以然等于没有学透。
fd34gs3yf 2018-09-10
  • 打赏
  • 举报
回复
引用 6 楼 zmidl 的回复:
[quote=引用 2 楼 war3tr 的回复:]
根本不需要找原因,老老实实的用委托,否则有你哭的时候

是的呀 就是发现个问题想找到答案啊,你只知其然,不知所以然等于没有学透。[/quote]
不要用“你”,用“我”,不想多给你讲道理,这年头有人回复你,你就庆幸吧
.NET 1.0之后的跨线程操作控件默认都会抛出异常,没有忽然又可以了之类的说法
this.TestText显然是自定义属性,在这里面进行了委托呢,或者修改了允许跨线程操作的配置呢
SoulRed 2018-09-07
  • 打赏
  • 举报
回复
委托只是确保不会产生多线程冲突。。。 有些BUG出现概率为0.01% 。夜路走多了就遇到鬼。。。啊哈哈
xuzuning 2018-09-07
  • 打赏
  • 举报
回复
只要不是自行启动的子线程,访问 UI 就无需 Invoke
这并没有什么可奇怪的
fd34gs3yf 2018-09-07
  • 打赏
  • 举报
回复
根本不需要找原因,老老实实的用委托,否则有你哭的时候
依然冷暖 2018-09-07
  • 打赏
  • 举报
回复
貌似vs2012时候就可以这样跨线程不报错了!好像不用invoke 调试模式下可以看到报警信息

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧