当前位置:编程学习 > C#/ASP.NET >>

C#中线程问题 点button2不能暂时停止线程 要一直执行完毕后,才自动停止?

C#中线程问题 点button2不能暂时停止线程 要一直执行完毕后,才自动停止,哪个地方要修改:
namespace searchBox1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            findMethod1 += new FindMethod(setListView);
            thread1 = new Thread(new ThreadStart(FindFiles));
        }
        
        /*以下为自定义的变量及函数  */
        private Thread thread1;
        public struct Files
        {
            public DirectoryInfo dir;
            public string fileName;
        }
        public Files files1;
        delegate void FindMethod(Files aFile);
        FindMethod findMethod1;
        public void FindFiles()
        {
            listView1.Invoke(findMethod1, new object[] { files1 }); 
        }
        public void setListView(Files file)           //搜索方法
        {
            FileInfo[] files = file.dir.GetFiles(file.fileName);
            if (files.Length != 0)
                foreach (FileInfo aFile in files)
                {
                    ListViewItem lvi = new ListViewItem(new string[] { aFile.Name, aFile.FullName, aFile.Length.ToString() + " KB", aFile.LastWriteTime.ToString() });
                    listView1.Items.Add(lvi);
                }
            DirectoryInfo[] dirs = file.dir.GetDirectories();
            if (dirs.Length != 0)
                foreach (DirectoryInfo aDir in dirs)
                {
                    Files fileChild;
                    fileChild.dir = aDir;
                    fileChild.fileName = file.fileName;
                    setListView(fileChild);        //递归搜索子文件夹里的文件
                }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                MessageBox.Show("文件名不能为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
            {
                string s = textBox1.Text;
                if (s.IndexOf(".") == -1)       //判断是否有后缀名
                    s += ".*";
                files1.fileName = s;
                FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
                if (folderBrowserDialog.ShowDialog() == DialogResult.OK)              //选取路径后启动搜索线程
                {
                    files1.dir = new DirectoryInfo(@folderBrowserDialog.SelectedPath.ToString());
                    thread1.Start();
                }
                else        //否则焦点返回主窗口输入框 
                    textBox1.Focus();    
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (thread1.IsAlive)
                thread1.Abort();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (thread1.ThreadState == ThreadState.Running)
                thread1.Suspend();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            label2.Text = thread1.ThreadState.ToString();
        }
    }
}  
--------------------编程问答-------------------- --------------------编程问答-------------------- 代码贴的不好,比较乱
应该是在 setListView的特循环中,加一个Thread.Sleep(0),阻塞一下当前线程,使系统能够处理其他线程的事件! --------------------编程问答-------------------- 你用的哪个ListView1.Invoke()里面有一个委托方法因为这个方法是同步执行的 
 就是说线程必须等到你委托所代理的方法执行完毕后
 线程才会结束 否则线程是处于阻塞状态的 
 如果你想直接就关闭的话  可以使用beginInvoke()方法 --------------------编程问答-------------------- 以上2位的方法调试了,还是不行,按钮2一直点不动,知道线程运行完后才可以。

代码复制到c#里可以运行的,哪位帮调试一下,看看什么问题 --------------------编程问答-------------------- 可以用event来终止 直到你点击另一个时唤醒它继续执行 --------------------编程问答-------------------- ManualResetEvent.Reset()阻止,ManualResetEvent.Set()唤醒继续执行  --------------------编程问答-------------------- 还是不行 --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,