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();
}
}

从正在搜索文件开始就卡死了,除非全部运行完成,这是为什么呢?
没有太多的金币了,之前问的太多了,哪位大声来回答下呢 ?%>_<%
展开
 我来答
玩转数据处理
2014-05-17 · 数据处理,Python,dotnet
玩转数据处理
采纳数:1613 获赞数:3794

向TA提问 私信TA
展开全部
把整个工程压缩黏上来,丢一堆代码上来鬼才帮你看
追答
http://pan.baidu.com/s/1c0mukDi 
帮你改了点点用到了非线程安全(程序不卡了),实际应用中不提倡使用非线程安全,好好去研究 backgroundworker 这个控件先,要看懂改过的程序先去了解下这个控件
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
哲事姓无
2014-05-17 · TA获得超过1176个赞
知道小有建树答主
回答量:903
采纳率:100%
帮助的人:431万
展开全部
点击了按钮后启动一个后台线程。但是在线程函数中调用 BeginInvoke 将 change 切换回界面线程去工作了。所以在chane函数返回前界面是不会有响应的,因为所有时间都花在运行change上了。

这样说你明白了吧。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-05-17
展开全部
脱掉裤子的话,总觉得哪里不对,气氛怪怪的。。。"——--我是一只小尾巴,咿呀咿呀呦。请关注我头象
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhang399401
2014-05-17 · TA获得超过702个赞
知道小有建树答主
回答量:1347
采纳率:0%
帮助的人:927万
展开全部
调试,一步一步的追 问题总会出来的,只看代码看不出什么的
追问
BeginInvoke 还是占用主线程的时间,界面就会卡死。我后来换了个办法,就是把大部分的函数功能从BegainInvoke对应的函数剥离开来了,让BeginInvoke只修改界面,感觉响应上好多了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式