再求C#,好用的延时方法~~

tenxp 2011-11-17 08:01:04
Thread.Sleep(1000); 方法老是 中断~~ 我不怎么会用 以用 界面就卡死~
循环的方法 ! 太占Cpu 因为我要长时间延时 用这个方法 CPU 一直50%

下面研究的大半天也不行~~~

using (var bg = new BackgroundWorker())
{
bg.DoWork += delegate
{

Thread.Sleep(5000);
label3.Text = "111"; // 代码放这里 执行就是提示错误~好像不能执行另一个线程里的东西。
};
bg.RunWorkerCompleted += delegate
{
Thread.Sleep(5000);
label3.Text = "111";// 代码放这里 还是会卡死~~


};
bg.RunWorkerAsync();
}
...全文
396 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Herbert 2011-11-18
  • 打赏
  • 举报
回复
label3.Text = "111"; // 代码放这里 执行就是提示错误~好像不能执行另一个线程里的东西。
改成:
this.Invoke((MethodInvoker)delegate(){label3.Text="111";});
zincy 2011-11-18
  • 打赏
  • 举报
回复
this.Invoke((MethodInvoker)delegate(){label3.Text="111";});
天二天 2011-11-18
  • 打赏
  • 举报
回复
不能用主线程,创建一个新的线程
天二天 2011-11-18
  • 打赏
  • 举报
回复
/// <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);
}
}

}

heroseven 2011-11-18
  • 打赏
  • 举报
回复
这种事情 直接用timer
绿领巾童鞋 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 herbt 的回复:]

label3.Text = "111"; // 代码放这里 执行就是提示错误~好像不能执行另一个线程里的东西。
改成:
this.Invoke((MethodInvoker)delegate(){label3.Text="111";});
[/Quote]
+1
abutwang 2011-11-18
  • 打赏
  • 举报
回复
label3.Text = "111"; // 代码放这里 执行就是提示错误~好像不能执行另一个线程里的东西。
这里卡死的原因是在BackgroundWorker的Dowork事件里你无法操作界面label,你可以ProgressChanged或者是RunWorkerCompleted里操作


label3.Text = "111";// 代码放这里 还是会卡死~~
这里卡死的原因有可能是你的BackgroundWorker不是在主进程里创建的,可能是其他进程创建的,所以如果你非要这么用的话BeginInvoke,Invoke
tenxp 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sp1234 的回复:]

建议看msdn。难道msdn对这个问题不比csdn明白很多么?
[/Quote]
看着头晕。
  • 打赏
  • 举报
回复
建议看msdn。难道msdn对这个问题不比csdn明白很多么?
tenxp 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhs23 的回复:]

异步里面

开始时间
while(true)
{
得到当前时间
2个时间判断 如果 时间够了 break。。。
}
[/Quote]

你这个就是循环判断阿,如果我延时1小时,这个循环就会持续1小时,CPU 负载很高也会持续1小时
迷迷520 2011-11-17
  • 打赏
  • 举报
回复
异步里面

开始时间
while(true)
{
得到当前时间
2个时间判断 如果 时间够了 break。。。
}
路人乙e 2011-11-17
  • 打赏
  • 举报
回复
这个源码里有你要的答案
http://download.csdn.net/detail/sq_zhuyi/2815120
tenxp 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sloveb520 的回复:]

后台线程是不能操作主线程的东西,比如 label3.Text = "111";
[/Quote]
我知道这个意思 ~ 但是怎么解决呢?
sloveb520 2011-11-17
  • 打赏
  • 举报
回复
后台线程是不能操作主线程的东西,比如 label3.Text = "111";

110,571

社区成员

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

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

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