C#子线程访问主线程的控件问题

liusa1997 2018-09-10 07:38:11
在背景线程监听消息如果有消息就让该控件闪动,但是即便写成这个调用,虽然能运行但是程序很卡,怎么处理呢?
...全文
688 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
flybirding10011 2018-09-12
  • 打赏
  • 举报
回复
threenewbee 2018-09-11
  • 打赏
  • 举报
回复
sleep不要写在invoke里
雪狼孤竹 2018-09-11
  • 打赏
  • 举报
回复
引用 5 楼 xomix 的回复:

t = new System.Threading.Thread(() =>
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(5);
this.BeginInvoke((Action)delegate
{
label1.Visible = !label1.Visible;
});
}
});

看看和你贴出的代码有什么不同,想想为什么。
很简单,你把应该放在线程里执行的暂停操作又扔回委托中阻塞主线程了。


基于5楼代码,改了下。

private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(DoThis));
t.IsBackground = true;
t.Start();
}
public void DoThis()
{
while (true)
{
System.Threading.Thread.Sleep(50);
this.BeginInvoke((Action)delegate
{
label1.Visible = !label1.Visible;
});
}
}
lxgmag2016 2018-09-11
  • 打赏
  • 举报
回复
主线程尽量少用
正怒月神 2018-09-11
  • 打赏
  • 举报
回复
你这只是通过委托刷新UI控件。
但是sleep还是在主线程的。
  • 打赏
  • 举报
回复
以后,我会将过去的有关线程池、Timer 等等语句来实现的异步机制,都改为 Task 的。虽然 Task 对于初学者容易产生歧义,但是毕竟潮流如此,歧义也必须直接面对,才能保证异步编程技术真正被理解。

这里的关键是理解同步和异步的区别,心中有异步机制。
  • 打赏
  • 举报
回复
await 语句的右边即可 --> await 关键字的右边即可
  • 打赏
  • 举报
回复
使用现在的 .net 框架以及现在的 c# 语法,是这样写的
private async void Form1_Load(object sender, EventArgs e)
{
for (var i = 1; i < 100; i++)
{
await Task.Delay(500);
this.label1.Text = i.ToString();
}
}

如果在过去,那么你就需要将异步回调写到 Timer 的委托回调中。而现在,就是写到 await 语句的右边即可!
  • 打赏
  • 举报
回复
写了代码没跑,这个代码不会再阻塞主线程,但是也不会闪烁,如果你想修复闪烁,用endinvock或者可以直接用timer。
我之前给别人做过一个panle闪烁的东西,但是我自己找不到了。。。。
  • 打赏
  • 举报
回复

t = new System.Threading.Thread(() =>
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(5);
this.BeginInvoke((Action)delegate
{
label1.Visible = !label1.Visible;
});
}
});

看看和你贴出的代码有什么不同,想想为什么。
很简单,你把应该放在线程里执行的暂停操作又扔回委托中阻塞主线程了。
xian_wwq 2018-09-11
  • 打赏
  • 举报
回复
楼上说的很清楚了,
卡是因为主线程阻塞了,阻塞是因为sleep
为何要sleep这么长时间呢?
liusa1997 2018-09-11
  • 打赏
  • 举报
回复
谢谢大家,解决问题了
liusa1997 2018-09-10
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
你把 UI 都挂起了,还能不卡?

那怎么处理呢?UI结束程序不就停了么?求指教
xuzuning 2018-09-10
  • 打赏
  • 举报
回复
你把 UI 都挂起了,还能不卡?

110,499

社区成员

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

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

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