线程使用while(true)问题

HUAFEIS 2014-10-27 02:24:32
我现在有个线程_thread,装载了一个方法

public void GetQueue()
{
while (true)
{
//做一些逻辑处理
}
}

因为while(true)这个条件目前不太适合,需要改成一个bool变量。如while(_current)
我如果将_current设为false.线程就终止,再将current设为true,线程也不会运行了。
请为如何来使该线程根据需要来停止和重启呢?
...全文
3295 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
phommy 2014-10-27
  • 打赏
  • 举报
回复

using System;
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Bitmap image;

        object lockObject = new object();
        public Form1() { InitializeComponent(); }

        void button1_Click(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                while (true)
                {
                    lock (lockObject)
                    {
                        Console.WriteLine(Environment.TickCount);
                    }
                }
            });
        }

        void button2_Click(object sender, EventArgs e) { Monitor.Enter(lockObject); }

        void button3_Click(object sender, EventArgs e) { Monitor.Exit(lockObject); }
    }
}
button1是启动线程 button2是停止 button3是继续
xiaozhang0372 2014-10-27
  • 打赏
  • 举报
回复
你的是线程处理完了就不能再继续执行了,跳出循环了。需要再创建一个线程来start; 可以像2L所说的那样。 也可以这样做

public void GetQueue()
{
while(true)
{
while(_current)
{
    //做一些逻辑处理
}
}
}
外边的循环是保证你开启的线程不会释放掉,里面的循环是保证你的_current为False的时候不会执行需要执行的代码
於黾 2014-10-27
  • 打赏
  • 举报
回复
重新new,然后start,其实也挺好 在你不需要使用线程的时候,它就真正的停止了,不会占用CPU资源 然后你的那些变量,可以定义成全局的,这样即使线程停止了,下次再运行,还用这一组变量不就得了,就可以从刚才的数据开始继续往下执行,而不是每次都要重来了
QQ234788028 2014-10-27
  • 打赏
  • 举报
回复

public void GetQueue()
{
       while (true)
       {
           if(_current)
            {
                      //做一些逻辑处理
             }
             else
             {
                    //休息下
              }
       }
}
xian_wwq 2014-10-27
  • 打赏
  • 举报
回复
引用 3 楼 xiangfei375 的回复:
[quote=引用 1 楼 superior_yong 的回复:] 弄个全局变量_Current,可以用button来改变_Current的值,按下button设为false或者true
现在用的是全局变量,_Current的值设为false后,线程就终止了,再设为true,线程也不会运行了[/quote]

bool bValid = true;
public void GetQueue()
 {      
         while (true)
        {           
           if(bValid)
           {
            //做一些逻辑处理        
      }
            else
           {
                //此处休息
                Thread.Sleep(1);  
           }
           Thread.Sleep(1);

    }
 } 
需要跳过,让bValid = false; 需要继续处理,bValid = true;
於黾 2014-10-27
  • 打赏
  • 举报
回复
两种办法 1.线程终止之后,想重新运行,重新new,然后start 2.变量不要放在while(_flag)里,而是 while(_Stop) { if(_pause) { Thread.Sleep(1000); } else { //dosomething } }
wmg494005678 2014-10-27
  • 打赏
  • 举报
回复
看你业务上是会在何种情况下,触发暂停的操作,线程中记得捕获就可以了
HUAFEIS 2014-10-27
  • 打赏
  • 举报
回复
引用 1 楼 superior_yong 的回复:
弄个全局变量_Current,可以用button来改变_Current的值,按下button设为false或者true
现在用的是全局变量,_Current的值设为false后,线程就终止了,再设为true,线程也不会运行了
winnowc 2014-10-27
  • 打赏
  • 举报
回复
需要的是让线程等待和继续,使用ManualResetEventSlim或者ManualResetEvent构造:

private ManualResetEventSlim _event = new ManualResetEventSlim();

// 线程循环
public void GetQueue()
{
    while (true)
    {
        _event.Wait(); //等待event
        //做一些逻辑处理
    }
}

_event.Set(); //开始/继续执行逻辑
_event.Reset(); //暂停执行逻辑
忘丿殇 2014-10-27
  • 打赏
  • 举报
回复
弄个全局变量_Current,可以用button来改变_Current的值,按下button设为false或者true

110,538

社区成员

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

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

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