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#