| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4258 人关注过本帖
标题:挂起/恢复线程的问题,关于ThreadState的状态,求指教!
只看楼主 加入收藏
yinzanxia
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-2-17
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:4 
挂起/恢复线程的问题,关于ThreadState的状态,求指教!
using System;
using System.Collections.Generic;
using
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;


//在单步调试过程中,实际上单击挂起线程按钮时,还未执行函数内的语句,t.ThreadState的值已经变成Stopped。为什么呢?

namespace thread_state
{
    public partial class Form1 : Form
    {
        private Thread t;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Sample st = new Sample(listBox1);   //实例化Sample类      
            t = new Thread(new ThreadStart(st.work));      //创建Thread对象

            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;     //注销此语句会出现错误,不知道为啥

        }

        
        private void button1_Click_1(object sender, EventArgs e)
        {
            t.Start();
            button1.Enabled = false;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (t.ThreadState == ThreadState.Running)      //线程已启动,它未被阻塞,并且没有挂起的 ThreadAbortException。
            {
                t.Suspend();       //挂起线程

              // listBox1.Items.Add("线程已挂起");
            button2.Enabled = false;
            button3.Enabled = true;
            }
            
            
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (t.ThreadState == ThreadState.Suspended)    //如果线程已挂起
            {
                t.Resume();                                //继续已挂起的线程
                button2.Enabled = true;
                button3.Enabled = false;
                //listBox1.Items.Add("线程已恢复");
            }
            
            
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (t.IsAlive & t.ThreadState == ThreadState.Running)  //IsAlive :如果此线程已启动并且尚未正常终止或中止,则为 true;否则为 false。

            {
                t.Abort();   
                listBox1.Items.Add("线程已停止");         
                button2.Enabled = false;
                button3.Enabled = false;
                button4.Enabled = false;            
            }
           
        }
    }

    public class Sample
    {
        private System.Windows.Forms.ListBox listBox1;

        public Sample(System.Windows.Forms.ListBox a)
        {
            this.listBox1 = a;
        }
        public void work()
        {
            listBox1.Items.Add("Sample 的 work 线程正在运行");

        }

    }
}


//  在单步调试时,发现:单击按钮事件的if条件{ 。。。}括号的语句未被 执行,就是单击按钮时,线程的状态t.Thread直接就变成Stopped了,不知道为什么???
搜索更多相关主题的帖子: class 函数 private public 
2012-02-17 15:52
_迷_
Rank: 2
等 级:论坛游民
帖 子:16
专家分:32
注 册:2012-2-17
收藏
得分:0 
看了,但不知道
2012-02-19 12:41
月光雪山
Rank: 2
等 级:论坛游民
威 望:4
帖 子:36
专家分:97
注 册:2012-1-10
收藏
得分:1 
回复 楼主 yinzanxia
单击按钮事件已不在线程的生命周期内,肯定是终止,如果要实现你的这种功能可以试试Timer
2012-02-20 09:54
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
收藏
得分:4 
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//这句是不检查跨线程调用控件
Sample类中的work函数在线程中直接调用控件,要引发异常,应该用委托
private delegate void AddItem(ListBox lb);
this.Invoke(new AddItem(st.work), new object[] { this.listBox1});
线程的状态t.Thread直接就变成Stopped了是因为t线程执行work函数瞬间就完了,线程就退出了,再操作它是不不对的

站在春哥的肩膀上
2012-02-20 10:13
yinzanxia
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-2-17
收藏
得分:0 
新学C#,基础篇还没看完,好多问题不是很懂。
2012-02-20 15:37
快速回复:挂起/恢复线程的问题,关于ThreadState的状态,求指教!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016031 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved