UI界面卡死

空白已存在 2019-02-22 04:25:10
加上timer后,UI界面就卡死,咋回事?
...全文
1165 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
NCScan 2019-03-07
  • 打赏
  • 举报
回复
Timer控件 时间调慢点,或者委托。
  • 打赏
  • 举报
回复
即使单线程也可以编写流畅的并发(分时)程序,关键在于你使用异步、事件驱动的设计思想,就能天然地做到高性能和流畅。
  • 打赏
  • 举报
回复
winform 的 Timer 控件,默认就是工作在主线程的。而如果你用 System.Timers.Timer,如果用鼠标拖入设计器的,默认是工作在主线程的,默认设置了SynchronizingObject 属性,如果是手动创建的、没有设置这个属性,则默认是在子线程工作的。如果你用 System.Threading.Timer 则是工作在子线程的。
小眼聚光~ 2019-03-06
  • 打赏
  • 举报
回复
用委托,处理主线程控件的时候用dispatcher.invoke去处理(应该没拼错把,嘻嘻)
我也是新手,说错勿怪哦
圣殿骑士18 2019-03-02
  • 打赏
  • 举报
回复
如果你这个timer是Forms.Timer,那和是不是用BeginInvoke无关,因为没有跨线程问题。
我倒是觉得,你在同一个timer事件里,又是write又是read,你怎么知道write之后,立即能读到数据呢?这是不是卡的原因。

应该把write和read异步处理吧。read应该用另外一个事件,serialPort.DataReceived



==========
欢迎关注微信公众号 “产品技术知与行” ,打造全面的结构化知识库,包括原创文章、免费课程(C#,Java,Js)、技术专题、视野知识、源码下载等内容。
最新文章:解读经典《C#高级编程》 第四章之 泛型的原理 https://mp.weixin.qq.com/s/3264VdbzqXWt7vn19ARrPQ
qiuqingpo 2019-03-01
  • 打赏
  • 举报
回复
后端更新ui要用委托的,不能直接更新
wwwspider001 2019-03-01
  • 打赏
  • 举报
回复
个人感觉关键点应该是在串口的读写上,卡在Read上的可能性最大 1、在Write和Read前后都加上Debug.WriteLine调试输出,看看界面卡在那部分 2、不要在timer事件里面加messagebox
  • 打赏
  • 举报
回复
this.TextBox5.Invoke(new Action(()=>
{
TextBox5.Text=......
TextBox6.Text=.....
TextBox7.Text=.....
TextBox8.Text=.....
}));
楼上已经有答案了,刷新控件一定要用异步,或者单独分离出来一个定时器timer也行
exception92 2019-02-27
  • 打赏
  • 举报
回复
几种timer的使用http://www.cnblogs.com/yang-fei/p/6169089.html
对于跨线程来进行UI更新,需要使用invoke或者begininvoke。
平底锅锅锅 2019-02-26
  • 打赏
  • 举报
回复
定时器里不要放处理时间过长的动作
北京.NET 2019-02-26
  • 打赏
  • 举报
回复
Timer 也属于线程,所以要异步修改UI

this.TextBox5.Invoke(new Action(()=>
{
TextBox5.Text=......
TextBox6.Text=.....
TextBox7.Text=.....
TextBox8.Text=.....
}));
xian_wwq 2019-02-26
  • 打赏
  • 举报
回复
timer的interval设置的多少, 如果间隔太小,因为timer中的串口读写的方法是阻塞的 timer就会出现重入, 随后各种奇奇怪怪的问题就出来了
无情时尚 2019-02-26
  • 打赏
  • 举报
回复

public void UpdateControlValue(Control c, string content)
        {
            if (c.InvokeRequired)
                c.Invoke((EventHandler) delegate { c.Text = content; });
            else
                c.Text = content;
        }
Chasmれ 2019-02-23
  • 打赏
  • 举报
回复
用委托,例如
  delegate void AddMsgDelegate(string msg);
        public void DAddMsg(string msg)
        {
            if (richText_msg.InvokeRequired)
            {
                Invoke(new AddMsgDelegate(DAddMsg), new object[] { msg });
            }
            else
            {
                this.richText_msg.AppendText(msg);
            }
        }
调用的时候用这个DAddMsg
  • 打赏
  • 举报
回复
给textbox赋值的时候用委托,
BeginInvoke(new EventHandler(delegate
{
textbox.Text = "123";
}));

110,533

社区成员

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

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

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