c# 实现使用线程不用sleep,但不卡的功能

我开启一个线程(里面是死循环,while(true)),线程里执行一些功能,最终结束时如果最终不用Thread.Sleep(1000)这种阻碍线程的方法,那么界面会有卡动... 我开启一个线程(里面是死循环,while(true)),线程里执行一些功能,最终结束时如果最终不用Thread.Sleep(1000)这种阻碍线程的方法,那么界面会有卡动,但是我sleep阻碍线程的时间太多了觉得浪费,而且也影响不必要的等待时间,太少了又卡,有没有什么办法让sleep精确,同时不影响界面使用? 展开
 我来答
376710727
推荐于2017-12-16 · TA获得超过8937个赞
知道大有可为答主
回答量:2593
采纳率:100%
帮助的人:1245万
展开全部

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性能不够而已。
狂奔的茶宝宝
2016-09-22 · 超过32用户采纳过TA的回答
知道答主
回答量:61
采纳率:0%
帮助的人:37.6万
展开全部
用控件的begininvoke在非UI线程中操纵控件应该会好一点
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳光的雷咩咩
2016-09-22 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7658万
展开全部
多线程啊,Task,之类。
更多追问追答
追问
我不就是使用的是线程吗?怎么弄,能详细说说吗
追答
贴你的代码,然后帮你改改
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式