c# 实现使用线程不用sleep,但不卡的功能
我开启一个线程(里面是死循环,while(true)),线程里执行一些功能,最终结束时如果最终不用Thread.Sleep(1000)这种阻碍线程的方法,那么界面会有卡动...
我开启一个线程(里面是死循环,while(true)),线程里执行一些功能,最终结束时如果最终不用Thread.Sleep(1000)这种阻碍线程的方法,那么界面会有卡动,但是我sleep阻碍线程的时间太多了觉得浪费,而且也影响不必要的等待时间,太少了又卡,有没有什么办法让sleep精确,同时不影响界面使用?
展开
3个回答
展开全部
Winform中,界面和线程是可以分离的。
一个winform程序必须有一个主线程, 即UI线程,默认所有的代码都是在UI线程里执行, 所以如果某一行代码耗时非常长,那么界面就会卡住(假死),直到这行代码执行完。
多线程就是为了解决这个问题的,
你需要开启一个后台线程
var thread = new System.Threading.Thread(new System.Threading.ThreadStart(()
=>
{
myVoid();
//这里面写你的代码,一般会吧比较耗时的方法放在后台里执行。
})) { IsBackground = true };
thread.Start();
如果你界面不需要直到结果, 那么这样就可以了, 界面线程永远是无阻塞的,也就不会卡死。
但是如果你需要直到后台线程处理的进度,(执行完了没有?或者执行了百分之几了?),
就需要从后台线程把值回调到UI线程, 这里需要用到委托。
在类的上方声明一个委托: 这里是最简单的bool类型的委托, 执行完了 就回调一个true
public delegate void MyDelegate(bool isbusy);
public event MyDelegate myEvent = null;
class myClass....//不写了
var thread = new System.Threading.Thread(new System.Threading.ThreadStart(()
=>
{
myVoid();
//这里面写你的代码,一般会吧比较耗时的方法放在后台里执行。
myEvent.Invoke(true);
//执行完了之后 回调一个true 给UI
})) { IsBackground = true };
thread.Start();
sysbusyEvent += (state) =>
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
if(state==true)
{
//如果后台的委托到这里了,就可以操作了
MessageBox.Show("执行完了!");
}
}));
};
追问
我用的第一种方法,的确好一点,但是我进任务管理器看了下,非常占cpu,本来我以前sleep的代码总共占10%-20%,现在占了50%左右,我线程是无限循环的哦
追答
你原来的程序只有一个线程, 就是UI主线程,
现在主线程在工作,同时还有一个后台线程在工作, 使用的CPU自然就高了。
如果不希望主线程因为计算而阻塞,两个线程是最少的,一般实际项目中,都是2-4个线程, 占用高只是你的计算比较复杂,或者CPU性能不够而已。
展开全部
用控件的begininvoke在非UI线程中操纵控件应该会好一点
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
多线程啊,Task,之类。
更多追问追答
追问
我不就是使用的是线程吗?怎么弄,能详细说说吗
追答
贴你的代码,然后帮你改改
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询