使用Thread.Sleep(5000),程序假死,请问该如何解决呢??

wdw1985 2011-11-22 04:06:28


if (counter == 0)
{
commVM700.WriteLine("execute Audio~Spectrum");
Thread.Sleep(5000);
}
else
{
Thread.Sleep(5000);

commVM700.WriteLine("getresults");
commVM700.WriteLine("show Audio~Spectrum");

int n = commVM700.BytesToRead; //获取接收缓冲区中数据的字节数
byte[] buf = new byte[n]; //定义一个临时数组用来储存当前来的串口数据
commVM700.Read(buf, 0, n); //读取缓冲数据
builder.Remove(0, builder.Length); //清楚字符串构造器中的内容

//直接按ASCII规则转换成字符串
builder.Append(Encoding.ASCII.GetString(buf));

string receivedData;
receivedData = builder.ToString();
ss.Add(receivedData);
}



程序需要等待一段时间,我就用了Thread.Sleep(),但是在等待的时间里程序就假死了,整个界面就没有响应了,移动或者切换别的窗口再回来就变白了。。。
请问这个问题该怎么解决呢,请高手给支个招吧!!!
...全文
1029 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
wushuai1346 2011-11-23
  • 打赏
  • 举报
回复
楼主~~~你把 主线程 给睡了,你要负责的~~~~
卧_槽 2011-11-23
  • 打赏
  • 举报
回复
不要在ui线程用sleep。

如果看不懂上面这句话,那就先看书。
lovesw97 2011-11-23
  • 打赏
  • 举报
回复
HOHO
后续代码放到TIMER计时器的触发里如何
Herbert 2011-11-23
  • 打赏
  • 举报
回复
调用DoEvent和Refresh窗体会闪烁 用线程的话是滥用线程 这该如何是好?
天二天 2011-11-23
  • 打赏
  • 举报
回复
/// <summary>
/// form主方法
/// </summary>
private void MainForm_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;//能在创建的线程中调用主窗体控件。
}

Thread thread = new Thread(this.NewThread);
thread.Start();


private void NewThread()
{
Feature feature = (Feature)parameter;


int interval = 0;

int.TryParse(feature.Interval, out interval);

if (interval == 0)
interval = 3600000; // 一小时

try
{


}
catch (Exception ex)
{
return;
}
finally
{
Thread.Sleep(interval);
}
}

}
fzl2497 2011-11-23
  • 打赏
  • 举报
回复
可以用多线程啊,我正在做得项目就遇到类似的问题,采用多线程解决了.是不能在主线程sleep的,不然都在等待这个sleep,程序肯定要等完了之后才能够继续执行下去
  • 打赏
  • 举报
回复
主线程进行阻塞不合适,难道滥用线程去阻塞就合适了?

考虑除了sleep你还有没有别的设计思路。
shaohaiou 2011-11-23
  • 打赏
  • 举报
回复
sleep主线程,此路不通,建议想想其他方式来实现你的需求
princefengsheng 2011-11-23
  • 打赏
  • 举报
回复
开一个新线程,主线程sleep是不可以的
labilaoxin 2011-11-23
  • 打赏
  • 举报
回复
把你原来 SLEEP后面的代码放到TIMER的TICK事件中去
labilaoxin 2011-11-23
  • 打赏
  • 举报
回复
放在线程里面达不到 需要暂停的效果。


用TIMER来实现好像比较方便一点。

wy811007 2011-11-23
  • 打赏
  • 举报
回复
撸过 学习下 多线程.
fengxuan0312 2011-11-22
  • 打赏
  • 举报
回复
开个新线程~
sloveb520 2011-11-22
  • 打赏
  • 举报
回复
把需要等待的,耗时的代码写到另外一个线程,可以用异步委托来做
绿领巾童鞋 2011-11-22
  • 打赏
  • 举报
回复
IsBackground = true
恩,你懂的
baihualin1983 2011-11-22
  • 打赏
  • 举报
回复
for(int i=0;i<100;i++)
{
Thread.Sleep(50);
Application.DoEvent();
}
hhddzz 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wdw1985 的回复:]

引用 9 楼 hhddzz 的回复:
引用 8 楼 wdw1985 的回复:

引用 7 楼 netteans 的回复:
用while空转判断时间跳出


不能逃避事实啊。。。。我想用sleep来解决这个问题啊。啊啊啊啊。。。

那就不可能


什么意思啊??就是说除了用while方法,就没有别的方法来让程序等待而又不假死了么。。。
[/Quote]
至少UI线程sleep是绝对不可能的
biancheng1000 2011-11-22
  • 打赏
  • 举报
回复
你可以把变化放到一个timer事件中,在外面控制timer,能不能解决你的问题呢?
wdw1985 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hhddzz 的回复:]
引用 8 楼 wdw1985 的回复:

引用 7 楼 netteans 的回复:
用while空转判断时间跳出


不能逃避事实啊。。。。我想用sleep来解决这个问题啊。啊啊啊啊。。。

那就不可能
[/Quote]

什么意思啊??就是说除了用while方法,就没有别的方法来让程序等待而又不假死了么。。。
hhddzz 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wdw1985 的回复:]

引用 7 楼 netteans 的回复:
用while空转判断时间跳出


不能逃避事实啊。。。。我想用sleep来解决这个问题啊。啊啊啊啊。。。
[/Quote]
那就不可能
加载更多回复(8)

110,535

社区成员

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

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

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