c#线程问题,为什么运行时会卡死?
privatevoidtoolStripButton4_Click(objectsender,EventArgse){正在搜索文件ToolStripMenuItem.Vi...
private void toolStripButton4_Click(object sender, EventArgs e)
{
正在搜索文件ToolStripMenuItem.Visible=true;
search = new Thread(new ThreadStart(function));
search.IsBackground = true;
search.Start();
}
private void function()
{
this.BeginInvoke(new SearchFile(change),new object[]{""});
}
private void change(string str)
{
if (str == "")
{
str = toolStripTextBox1.Text;
foreach (ListViewItem lvi in listView1.Items)
{
if (lvi.SubItems[0].Text != str)
lvi.Remove();
}
}
DirectoryInfo folder = new DirectoryInfo(str);
DirectoryInfo[] subfolder = null;
//toolStripLabel5.Text = str;
try
{
subfolder = folder.GetDirectories();
}
catch (IOException)
{
}
catch (UnauthorizedAccessException)
{
}
if (subfolder == null)
return;
foreach (DirectoryInfo di in subfolder)
{
if(di.Name==toolStripTextBox2.Text)
listView1.Items.Add(new ListViewItem(new string[] { di.Name, di.LastWriteTime.ToString(), "文件夹", "" }, "5.ico"));
if (str[str.Length-1]=='\\')
change(str + di.Name);
else
change(str + "\\" + di.Name);
}
FileInfo[] file = null;
try
{
file = folder.GetFiles();
}
catch (UnauthorizedAccessException)
{
}
if (file != null)
{
foreach (FileInfo f in file)
{
if (f.Name == toolStripTextBox2.Text)
{
listView1.Items.Add(new ListViewItem(new string[] { f.Name, f.LastWriteTime.ToString(), "文件", GetFileSize(f) }, "7.ico"));
}
}
}
if (str == toolStripTextBox1.Text)
{
正在搜索文件ToolStripMenuItem.Visible = false;
if (listView1.Items.Count == 0)
MessageBox.Show("无此文件");
search.Abort();
}
}
从正在搜索文件开始就卡死了,除非全部运行完成,这是为什么呢?
没有太多的金币了,之前问的太多了,哪位大声来回答下呢 ?%>_<% 展开
{
正在搜索文件ToolStripMenuItem.Visible=true;
search = new Thread(new ThreadStart(function));
search.IsBackground = true;
search.Start();
}
private void function()
{
this.BeginInvoke(new SearchFile(change),new object[]{""});
}
private void change(string str)
{
if (str == "")
{
str = toolStripTextBox1.Text;
foreach (ListViewItem lvi in listView1.Items)
{
if (lvi.SubItems[0].Text != str)
lvi.Remove();
}
}
DirectoryInfo folder = new DirectoryInfo(str);
DirectoryInfo[] subfolder = null;
//toolStripLabel5.Text = str;
try
{
subfolder = folder.GetDirectories();
}
catch (IOException)
{
}
catch (UnauthorizedAccessException)
{
}
if (subfolder == null)
return;
foreach (DirectoryInfo di in subfolder)
{
if(di.Name==toolStripTextBox2.Text)
listView1.Items.Add(new ListViewItem(new string[] { di.Name, di.LastWriteTime.ToString(), "文件夹", "" }, "5.ico"));
if (str[str.Length-1]=='\\')
change(str + di.Name);
else
change(str + "\\" + di.Name);
}
FileInfo[] file = null;
try
{
file = folder.GetFiles();
}
catch (UnauthorizedAccessException)
{
}
if (file != null)
{
foreach (FileInfo f in file)
{
if (f.Name == toolStripTextBox2.Text)
{
listView1.Items.Add(new ListViewItem(new string[] { f.Name, f.LastWriteTime.ToString(), "文件", GetFileSize(f) }, "7.ico"));
}
}
}
if (str == toolStripTextBox1.Text)
{
正在搜索文件ToolStripMenuItem.Visible = false;
if (listView1.Items.Count == 0)
MessageBox.Show("无此文件");
search.Abort();
}
}
从正在搜索文件开始就卡死了,除非全部运行完成,这是为什么呢?
没有太多的金币了,之前问的太多了,哪位大声来回答下呢 ?%>_<% 展开
4个回答
展开全部
把整个工程压缩黏上来,丢一堆代码上来鬼才帮你看
追答
http://pan.baidu.com/s/1c0mukDi
帮你改了点点用到了非线程安全(程序不卡了),实际应用中不提倡使用非线程安全,好好去研究 backgroundworker 这个控件先,要看懂改过的程序先去了解下这个控件
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
点击了按钮后启动一个后台线程。但是在线程函数中调用 BeginInvoke 将 change 切换回界面线程去工作了。所以在chane函数返回前界面是不会有响应的,因为所有时间都花在运行change上了。
这样说你明白了吧。
这样说你明白了吧。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-05-17
展开全部
脱掉裤子的话,总觉得哪里不对,气氛怪怪的。。。"——--我是一只小尾巴,咿呀咿呀呦。请关注我头象
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
调试,一步一步的追 问题总会出来的,只看代码看不出什么的
追问
BeginInvoke 还是占用主线程的时间,界面就会卡死。我后来换了个办法,就是把大部分的函数功能从BegainInvoke对应的函数剥离开来了,让BeginInvoke只修改界面,感觉响应上好多了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询