C#线程启动、暂停、恢复、停止怎么实现

w946995383_02 2016-08-22 05:07:04
论坛的大神你们好,我是一个菜鸟,肯请大家帮个忙实现如下功能:

首先窗体界面如下:


怎么实现“start”启动线程、“pause”暂停线程、“resume”恢复线程,“stop”停止线程,
直观现象是,按start启动计数,在右边输出,点pause,会暂停输出,然后点resume能够继续输出,点stop则停止输出(这时候再点resume没反应,只能点start开始重新输出)
下图是暂停,但是我没法儿恢复继续输出


在此,小弟先行谢过了!
...全文
19817 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkgggkg 2018-04-16
  • 打赏
  • 举报
回复
引用 5 楼 w946995383_02 的回复:
[quote=引用 2 楼 qq_20324803 的回复:] Thread已经快被抛弃了。学习TPL。TASK类。TASK支持取消,延迟,状态, 不过暂停怎么弄呢。TASK倒是可以等待Task。应该也可以实现。 不过Task比Thread好用多了。
过时的东西我都费劲,对于c#也才接触没多久,不到半年[/quote] 误伤 抱歉碰你楼下那个呢
kkgggkg 2018-04-16
  • 打赏
  • 举报
回复
引用 5 楼 w946995383_02 的回复:
[quote=引用 2 楼 qq_20324803 的回复:] Thread已经快被抛弃了。学习TPL。TASK类。TASK支持取消,延迟,状态, 不过暂停怎么弄呢。TASK倒是可以等待Task。应该也可以实现。 不过Task比Thread好用多了。
过时的东西我都费劲,对于c#也才接触没多久,不到半年[/quote] 强行装--b?你给我算算一行代码多少重?人家这么谦虚问问题,你是不是s---b啊,哪里来的优越感,你家人这么教你喷fen的吗?说有说不出个所以然,一会微软不赞成一会你这个方法可以实现,你可以装逼但不要在一无所知的时候暴露自己,你真聪明(ruozhidongxi) 屁不懂还装
starriver9101 2017-11-10
  • 打赏
  • 举报
回复
引用 22 楼 qq_27111803 的回复:
[quote=引用 21 楼 hiose89 的回复:] [quote=引用 19 楼 w946995383_02 的回复:] [quote=引用 14 楼 hiose89 的回复:]

namespace Test
{ 
    
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
            Label.CheckForIllegalCrossThreadCalls = false;
        }
        Thread thread;
        ManualResetEvent ma;
        bool on_off = false;
        bool stop = false;

        private void button1_Click(object sender, EventArgs e)
        {
            thread = new Thread(Runtime);
            thread.Start();
        }


        void Runtime()
        {
            for (int i = 1; i <= 100; i++)
            {
                if (stop)
                    return;
                if (on_off)
                {
                    ma = new ManualResetEvent(false);
                    ma.WaitOne();
                }
                textBox1.AppendText("计时 :" + i + "\r\n");
                Thread.Sleep(100);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            on_off = true;
       
        }

        private void button3_Click(object sender, EventArgs e)
        {
            on_off = false;
            ma.Set();
            textBox1.AppendText("继续计时 :\r\n");
        }

        private void button4_Click(object sender, EventArgs e)
        {
            stop = true;
            textBox1.AppendText("停止计时 \r\n");
        }
    }
}

大神,谢谢了,要的功能差不多实现了,还有些小问题,我自己来,再次感谢![/quote] 如果打印出错就把 textBox1.AppendText("暂停中 :\r\n");放进 if (on_off)条件里 其他的问题你自己解决[/quote] 小白提个问题啦 怎么停止了一次就无法再次开启了,只能关闭掉窗体再开启才行[/quote] button1_Click事件中,把stop变量重置为false
tianhen0828 2017-08-08
  • 打赏
  • 举报
回复
mark一下,跟着学习学习
lzh9619 2017-02-21
  • 打赏
  • 举报
回复
引用 22 楼 qq_27111803 的回复:
[quote=引用 21 楼 hiose89 的回复:] [quote=引用 19 楼 w946995383_02 的回复:] [quote=引用 14 楼 hiose89 的回复:]

namespace Test
{ 
    
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
            Label.CheckForIllegalCrossThreadCalls = false;
        }
        Thread thread;
        ManualResetEvent ma;
        bool on_off = false;
        bool stop = false;

        private void button1_Click(object sender, EventArgs e)
        {
            thread = new Thread(Runtime);
            thread.Start();
        }


        void Runtime()
        {
            for (int i = 1; i <= 100; i++)
            {
                if (stop)
                    return;
                if (on_off)
                {
                    ma = new ManualResetEvent(false);
                    ma.WaitOne();
                }
                textBox1.AppendText("计时 :" + i + "\r\n");
                Thread.Sleep(100);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            on_off = true;
       
        }

        private void button3_Click(object sender, EventArgs e)
        {
            on_off = false;
            ma.Set();
            textBox1.AppendText("继续计时 :\r\n");
        }

        private void button4_Click(object sender, EventArgs e)
        {
            stop = true;
            textBox1.AppendText("停止计时 \r\n");
        }
    }
}

大神,谢谢了,要的功能差不多实现了,还有些小问题,我自己来,再次感谢![/quote] 如果打印出错就把 textBox1.AppendText("暂停中 :\r\n");放进 if (on_off)条件里 其他的问题你自己解决[/quote] 小白提个问题啦 怎么停止了一次就无法再次开启了,只能关闭掉窗体再开启才行[/quote] 尽量别在这个线程里使用。把UI改动托管到UI线程中。
韓羽 2017-01-09
  • 打赏
  • 举报
回复
引用 21 楼 hiose89 的回复:
[quote=引用 19 楼 w946995383_02 的回复:] [quote=引用 14 楼 hiose89 的回复:]

namespace Test
{ 
    
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
            Label.CheckForIllegalCrossThreadCalls = false;
        }
        Thread thread;
        ManualResetEvent ma;
        bool on_off = false;
        bool stop = false;

        private void button1_Click(object sender, EventArgs e)
        {
            thread = new Thread(Runtime);
            thread.Start();
        }


        void Runtime()
        {
            for (int i = 1; i <= 100; i++)
            {
                if (stop)
                    return;
                if (on_off)
                {
                    ma = new ManualResetEvent(false);
                    ma.WaitOne();
                }
                textBox1.AppendText("计时 :" + i + "\r\n");
                Thread.Sleep(100);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            on_off = true;
       
        }

        private void button3_Click(object sender, EventArgs e)
        {
            on_off = false;
            ma.Set();
            textBox1.AppendText("继续计时 :\r\n");
        }

        private void button4_Click(object sender, EventArgs e)
        {
            stop = true;
            textBox1.AppendText("停止计时 \r\n");
        }
    }
}

大神,谢谢了,要的功能差不多实现了,还有些小问题,我自己来,再次感谢![/quote] 如果打印出错就把 textBox1.AppendText("暂停中 :\r\n");放进 if (on_off)条件里 其他的问题你自己解决[/quote] 小白提个问题啦 怎么停止了一次就无法再次开启了,只能关闭掉窗体再开启才行
stbneqcg 2016-08-23
  • 打赏
  • 举报
回复
关键在于 myResetEvent.WaitOne(); 这个东西 放在线程里 每次到这里都会挂起 myResetEvent.Set(); 直到这个执行才会执行一次!~ 所以这个要一直循环执行 上面那个才会执行
hiose89 2016-08-23
  • 打赏
  • 举报
回复
引用 19 楼 w946995383_02 的回复:
[quote=引用 14 楼 hiose89 的回复:]

namespace Test
{ 
    
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
            Label.CheckForIllegalCrossThreadCalls = false;
        }
        Thread thread;
        ManualResetEvent ma;
        bool on_off = false;
        bool stop = false;

        private void button1_Click(object sender, EventArgs e)
        {
            thread = new Thread(Runtime);
            thread.Start();
        }


        void Runtime()
        {
            for (int i = 1; i <= 100; i++)
            {
                if (stop)
                    return;
                if (on_off)
                {
                    ma = new ManualResetEvent(false);
                    ma.WaitOne();
                }
                textBox1.AppendText("计时 :" + i + "\r\n");
                Thread.Sleep(100);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            on_off = true;
       
        }

        private void button3_Click(object sender, EventArgs e)
        {
            on_off = false;
            ma.Set();
            textBox1.AppendText("继续计时 :\r\n");
        }

        private void button4_Click(object sender, EventArgs e)
        {
            stop = true;
            textBox1.AppendText("停止计时 \r\n");
        }
    }
}

大神,谢谢了,要的功能差不多实现了,还有些小问题,我自己来,再次感谢![/quote] 如果打印出错就把 textBox1.AppendText("暂停中 :\r\n");放进 if (on_off)条件里 其他的问题你自己解决
w946995383_02 2016-08-23
  • 打赏
  • 举报
回复
引用 16 楼 u013460284 的回复:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Threading; using System.Windows.Forms; namespace 线程挂起测试 { public partial class Form1 : Form { static AutoResetEvent myResetEvent = new AutoResetEvent(false); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; } private void button1_Click(object sender, EventArgs e) { 多线程(); PT(); } private void button2_Click(object sender, EventArgs e) { PD = false; } private void button3_Click(object sender, EventArgs e) { PD = true; PT(); } private void 多线程()//创建线程执行 计时 { ThreadStart entry = new ThreadStart(计时); Thread workThread = new Thread(entry); workThread.IsBackground = true; workThread.Start(); //a = workThread.GetHashCode(); } private void 计时() { textBox1.Text = "逐个计数到100为止\r\n"; for (int i = 0; i < 101; i++) { textBox1.Text += "逐秒计时" + i + "\r\n"; Thread.Sleep(1000); myResetEvent.WaitOne(); } } private bool PD = true; //false private void 判断是否执行() { while (PD) { myResetEvent.Set(); } } private void PT()//创建后台线程执行 判断是否执行 { ThreadStart entry = new ThreadStart(判断是否执行); Thread workThread = new Thread(entry); workThread.IsBackground = true; workThread.Start(); } } } 退出线程没写 留给你自己写了 我倒是想写直接退出程序
谢过大神!!!
w946995383_02 2016-08-23
  • 打赏
  • 举报
回复
引用 14 楼 hiose89 的回复:

namespace Test
{ 
    
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
            Label.CheckForIllegalCrossThreadCalls = false;
        }
        Thread thread;
        ManualResetEvent ma;
        bool on_off = false;
        bool stop = false;

        private void button1_Click(object sender, EventArgs e)
        {
            thread = new Thread(Runtime);
            thread.Start();
        }


        void Runtime()
        {
            for (int i = 1; i <= 100; i++)
            {
                if (stop)
                    return;
                if (on_off)
                {
                    ma = new ManualResetEvent(false);
                    ma.WaitOne();
                }
                textBox1.AppendText("计时 :" + i + "\r\n");
                Thread.Sleep(100);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            on_off = true;
            textBox1.AppendText("暂停中 :\r\n");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            on_off = false;
            ma.Set();
            textBox1.AppendText("继续计时 :\r\n");
        }

        private void button4_Click(object sender, EventArgs e)
        {
            stop = true;
            textBox1.AppendText("停止计时 \r\n");
        }
    }
}

大神,谢谢了,要的功能差不多实现了,还有些小问题,我自己来,再次感谢!
stbneqcg 2016-08-22
  • 打赏
  • 举报
回复
一般这种东西 叫挂起线程 搜这个你就懂了 具体代码我是在知乎上找到的
stbneqcg 2016-08-22
  • 打赏
  • 举报
回复
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Threading; using System.Windows.Forms; namespace 线程挂起测试 { public partial class Form1 : Form { static AutoResetEvent myResetEvent = new AutoResetEvent(false); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; } private void button1_Click(object sender, EventArgs e) { 多线程(); PT(); } private void button2_Click(object sender, EventArgs e) { PD = false; } private void button3_Click(object sender, EventArgs e) { PD = true; PT(); } private void 多线程()//创建线程执行 计时 { ThreadStart entry = new ThreadStart(计时); Thread workThread = new Thread(entry); workThread.IsBackground = true; workThread.Start(); //a = workThread.GetHashCode(); } private void 计时() { textBox1.Text = "逐个计数到100为止\r\n"; for (int i = 0; i < 101; i++) { textBox1.Text += "逐秒计时" + i + "\r\n"; Thread.Sleep(1000); myResetEvent.WaitOne(); } } private bool PD = true; //false private void 判断是否执行() { while (PD) { myResetEvent.Set(); } } private void PT()//创建后台线程执行 判断是否执行 { ThreadStart entry = new ThreadStart(判断是否执行); Thread workThread = new Thread(entry); workThread.IsBackground = true; workThread.Start(); } } } 退出线程没写 留给你自己写了 我倒是想写直接退出程序
hiose89 2016-08-22
  • 打赏
  • 举报
回复
引用 13 楼 w946995383_02 的回复:
[quote=引用 10 楼 hiose89 的回复:] [quote=引用 7 楼 w946995383_02 的回复:] [quote=引用 6 楼 shingoscar 的回复:] [quote=引用 4 楼 w946995383_02 的回复:] 在任意一个时候都可以暂停,按继续后还能直接继续动作而不需要进行原点复位
请现实点,不要异想天开 当然你硬要用Suspend和Resume也可以[/quote] 这不是异想天开,我用过日本人的设备把这种功能玩的炉火纯青了,真正的任意时间暂停!只是看不到人家的源码而已 [/quote] 暂停线程有一万多种办法。。和日本人有什么关系[/quote] 我知道咱们有很多大牛,但是网上找的一些方法跟我都没办法实现我想要的效果,这些对你们来说不是小菜一碟么,大牛们,帮个忙贴个代码出来呗,谢谢了。[/quote] 有点简单 ,不知道你是不是这个意思 ,
hiose89 2016-08-22
  • 打赏
  • 举报
回复



namespace Test
{

public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
Label.CheckForIllegalCrossThreadCalls = false;
}
Thread thread;
ManualResetEvent ma;
bool on_off = false;
bool stop = false;

private void button1_Click(object sender, EventArgs e)
{
thread = new Thread(Runtime);
thread.Start();
}


void Runtime()
{
for (int i = 1; i <= 100; i++)
{
if (stop)
return;
if (on_off)
{
ma = new ManualResetEvent(false);
ma.WaitOne();
}
textBox1.AppendText("计时 :" + i + "\r\n");
Thread.Sleep(100);
}
}

private void button2_Click(object sender, EventArgs e)
{
on_off = true;
textBox1.AppendText("暂停中 :\r\n");
}

private void button3_Click(object sender, EventArgs e)
{
on_off = false;
ma.Set();
textBox1.AppendText("继续计时 :\r\n");
}

private void button4_Click(object sender, EventArgs e)
{
stop = true;
textBox1.AppendText("停止计时 \r\n");
}
}
}


w946995383_02 2016-08-22
  • 打赏
  • 举报
回复
引用 10 楼 hiose89 的回复:
[quote=引用 7 楼 w946995383_02 的回复:] [quote=引用 6 楼 shingoscar 的回复:] [quote=引用 4 楼 w946995383_02 的回复:] 在任意一个时候都可以暂停,按继续后还能直接继续动作而不需要进行原点复位
请现实点,不要异想天开 当然你硬要用Suspend和Resume也可以[/quote] 这不是异想天开,我用过日本人的设备把这种功能玩的炉火纯青了,真正的任意时间暂停!只是看不到人家的源码而已 [/quote] 暂停线程有一万多种办法。。和日本人有什么关系[/quote] 我知道咱们有很多大牛,但是网上找的一些方法跟我都没办法实现我想要的效果,这些对你们来说不是小菜一碟么,大牛们,帮个忙贴个代码出来呗,谢谢了。
hiose89 2016-08-22
  • 打赏
  • 举报
回复
引用 11 楼 shingoscar 的回复:
[quote=引用 7 楼 w946995383_02 的回复:] 真正的任意时间暂停!
话别说的这么绝对 有没有学过牛顿第一个第二定律,除非是没有质量的物体,否则怎么可能做到任意时间暂停 所以但凡暂停都是有过程的,只不过时间很短,你看不到而已。 线程暂停也是一样的 就像我最开始举例的timer,你可以把interval设置成1,那卡顿的现象就没有了呗 而且你看你第二张图,根本就没有表达出你真正的目的。[/quote] 编程关力学什么事、、、、、
Poopaye 2016-08-22
  • 打赏
  • 举报
回复
引用 7 楼 w946995383_02 的回复:
真正的任意时间暂停!
话别说的这么绝对 有没有学过牛顿第一个第二定律,除非是没有质量的物体,否则怎么可能做到任意时间暂停 所以但凡暂停都是有过程的,只不过时间很短,你看不到而已。 线程暂停也是一样的 就像我最开始举例的timer,你可以把interval设置成1,那卡顿的现象就没有了呗 而且你看你第二张图,根本就没有表达出你真正的目的。
hiose89 2016-08-22
  • 打赏
  • 举报
回复
引用 7 楼 w946995383_02 的回复:
[quote=引用 6 楼 shingoscar 的回复:] [quote=引用 4 楼 w946995383_02 的回复:] 在任意一个时候都可以暂停,按继续后还能直接继续动作而不需要进行原点复位
请现实点,不要异想天开 当然你硬要用Suspend和Resume也可以[/quote] 这不是异想天开,我用过日本人的设备把这种功能玩的炉火纯青了,真正的任意时间暂停!只是看不到人家的源码而已 [/quote] 暂停线程有一万多种办法。。和日本人有什么关系
hiose89 2016-08-22
  • 打赏
  • 举报
回复
教你个简单实用的。 ManualResetEvent 类可以 阻挡线程 ManualResetEvent manu = new ManualResetEvent(false); manu .waitone();用来暂停 manu.set()继续
hiose89 2016-08-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_20324803 的回复:
Thread已经快被抛弃了。学习TPL。TASK类。TASK支持取消,延迟,状态, 不过暂停怎么弄呢。TASK倒是可以等待Task。应该也可以实现。 不过Task比Thread好用多了。
task我也刚接触,wait到底是能当暂停来理解吗 用过wait用 线程被阻断, 有什么方法是继续线程吗
加载更多回复(7)

111,098

社区成员

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

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

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