实现监听功能

寒冰2046 2010-11-11 04:57:30
当满足条件时IsXXX()返回true,否则返回false。前提:总会到达满足条件的时候,但是时间不确定。如果没有满足条件,则一直等待下去,不执行另外的语句,但是界面要能够响应操作,否则这个监听就无法控制了。在while中用Thread.Sleep会造成界面假死;在while中不用Thread.Sleep而用 Application.DoEvents()则会导致CPU占用率接近50%。如果在while中同时用Thread.Sleep(50)和Application.DoEvents(),那么表面上看不假死了,致CPU占用率也降下来了,但是事实上UI线程还是阻塞了的,界面不好使,有时点按钮没反应。
所以想避免用while,如果用多线程的话,会不会在IsDoNext()还没返回的情况下,主线程就执行接下来的操作了?

private bool m_isLisening = true;
private void button1_Click(object sender, EventArgs e)
{
if (IsDoNext() == true)
{ //执行语句块A
}
else
{ //执行语句块B
}
}

private void button2_Click(object sender, EventArgs e)
{
//切换监听状态
if (m_isLisening == true)
{
m_isLisening = false;
}
else
{
m_isLisening = true;
}
}

private bool IsDoNext()
{
while (IsOK() == false && m_isLisening == true)
{
Thread.Sleep(3000);
}
return true;
}

private bool IsOK()
{
if (满足条件)
{
return true;
}
else
{
return false;
}
}
...全文
167 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
songxiangzaiya 2010-11-11
  • 打赏
  • 举报
回复
在UI中使用sleep或者其它的费时的操作,都会阻塞主线程的,可以再开一个线程,在新开的线程中计算,完成后可以更新UI的。
ztenv 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 linkor 的回复:]
引用 1 楼 zenghd 的回复:

在UI线程里使用Sleep,会阻塞UI的, 可以使用多线程,可以使用DoEvents

用 Application.DoEvents()则会导致CPU占用率接近50%。
如果用多线程的话,会不会在IsDoNext()还没返回的情况下,主线程就执行接下来的操作了?
谢谢先了~
[/Quote]

会的,一定会的,这才叫多线程,你可以设置一个信号量,当线程执行完的时候,重置这个信号量,这样在isdonext()那里就等待这个信号量就行了,当信号量有信号了,就证明线程执行完了,你就可以继续下面的工作了,
ZengHD 2010-11-11
  • 打赏
  • 举报
回复
是啊,在另外一个线程里使用Sleep不会阻塞UI线程
寒冰2046 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zenghd 的回复:]

在UI线程里使用Sleep,会阻塞UI的, 可以使用多线程,可以使用DoEvents
[/Quote]
用 Application.DoEvents()则会导致CPU占用率接近50%。
如果用多线程的话,会不会在IsDoNext()还没返回的情况下,主线程就执行接下来的操作了?
谢谢先了~
ZengHD 2010-11-11
  • 打赏
  • 举报
回复
在UI线程里使用Sleep,会阻塞UI的, 可以使用多线程,可以使用DoEvents

111,129

社区成员

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

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

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