关于C#多线程问题

derek02 2009-10-03 02:00:06
小弟最近写了一个类似优化大师系统清理的小工具,运行中出现了个问题:
我用优化大师进行文件扫描时,可以进行其软件中其他操作。但我写的那厮在扫描文件时鼠标一直显示“忙”的状态,只有眼睁睁的看他遍历完所有文件才可执行其他操作。
起初以为是单线程搞得鬼,但在调用多线程后依然没有改观。是不是还缺些什么,比如需要后台运行什么的。。。应该怎么做,小弟苦恼。希望各位解惑。
...全文
189 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
var_soul 2009-10-13
  • 打赏
  • 举报
回复
异步回调
derek02 2009-10-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cnzdgs 的回复:]
主线程不要等待扫描结果。
[/Quote]
在下还处于初级阶段,是否需调用到API?可否给个确切的解决方案?感激不尽!
derek02 2009-10-04
  • 打赏
  • 举报
回复
不好意思,刚刚上线。

//文件搜索代码部分
int scanout_i = 0;
public void serachfile(string filedirectory, int file_i)//file_i为之前定义垃圾文件类型索引
{
DirectoryInfo dir = new DirectoryInfo(filedirectory);
DirectoryInfo[] child_dir = null;
FileInfo[] child_file = null;
try
{
child_dir = dir.GetDirectories();
child_file = dir.GetFiles(files.Items[file_i].Text);
//遍历所有文件夹
foreach (DirectoryInfo childir in child_dir)
{
serachfile(childir.FullName, file_i);
}
//遍历输出所有文件名,类型,大小,总数
foreach (FileInfo childfile in child_file)
{
scanout.Items.Add(childfile.Name);
scanout.Items[scanout_i].SubItems.Add(childfile.FullName);
scanout.Items[scanout_i++].SubItems.Add(childfile.Length.ToString());
filelab.Text = scanout.Items.Count.ToString();
Application.DoEvents();
}
}
catch {}
}
//扫描文件方法
delegate void delescan();
public void scanfile()
{
int driver_i = 0;
int filesign = 0;
while (driver_i < driverinfo.Items.Count)
{
//跨线程访问控件
if (driverinfo.InvokeRequired || files.InvokeRequired)
{
delescan d = new delescan(scanfile);
Invoke(d);
}
else if (driverinfo.Items[driver_i].Checked)
{
while (filesign < files.Items.Count)
{
if (files.Items[filesign].Checked)
{
serachfile(driverinfo.Items[driver_i].Text, filesign);
}
filesign++;
}
}
driver_i++;
filesign = 0;
}
}
//扫描单击事件
Thread scan = new Thread(new ThreadStart(scanfile));
if (scancmd.Text == "扫描")
{
scancmd.Text = "停止";
scanout.Items.Clear();
tabControl2.DeselectTab(0);//切换入扫描文件选项卡
scan.Start();
MessageBox.Show("扫描完毕", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
scancmd.Text = "扫描";
delallfilecmd.Enabled = true;
delfilecmd.Enabled = true;
}
else
{
scancmd.Text = "扫描";
scan.Abort();
}

的确是可以依次显示处理结果,但还是需要等待扫描的完成。在此之前不可以执行其他的操作了。
xminsong 2009-10-04
  • 打赏
  • 举报
回复
如要求不高的话,直接用BackgroundWorker,简单又安全。
derek02 2009-10-04
  • 打赏
  • 举报
回复
谢谢各位。
我试下。
24K純帥 2009-10-04
  • 打赏
  • 举报
回复
顶下。。
conan19771130 2009-10-04
  • 打赏
  • 举报
回复
只是多线程啊
ppmz1987 2009-10-04
  • 打赏
  • 举报
回复
再补充:还要提醒LZ,那你一定要确保 每一个线程 干的事情都不一样!!否则会重复扫描,甚至比没用线程时扫描效率更低!!!
kennie_190602169 2009-10-04
  • 打赏
  • 举报
回复
ding
ppmz1987 2009-10-04
  • 打赏
  • 举报
回复
再补充下,因为你就只开了一个子线程,对于效率上来说,开没开子线程,都一样。所以你会感觉还是很慢。
ppmz1987 2009-10-04
  • 打赏
  • 举报
回复
你点击扫描后,肯定是立马报告 扫描完成!但其实并未扫描完成。


你在 //扫描单击事件 启动若干个线程,例如10个线程,但要注意提示扫描完成之前,要确保前面的子线程已经结束

Thread[] scan = new Thread(new ThreadStart(scanfile))[10];

if (scancmd.Text == "扫描")
{
...
for(int i=0;i<scan.Length;i++)
{
scan[i].Start();
}
....
}

在调用serachfile(driverinfo.Items[driver_i].Text, filesign);你也可以启动子线程
但我感觉这样会建立很多线程。不建议,自己看着办吧。



春天的气息 2009-10-03
  • 打赏
  • 举报
回复
new Thread(new ThreadStart(扫描文件)).Start();

可以贴出来你的代码看看!
_see_you_again_ 2009-10-03
  • 打赏
  • 举报
回复
Application.DoEvents(); 性能很差
new Thread(new ThreadStart(扫描文件)).Start();
cnzdgs 2009-10-03
  • 打赏
  • 举报
回复
主线程不要等待扫描结果。
Learn-anything 2009-10-03
  • 打赏
  • 举报
回复
应该是跟界面有关系哦
xiahengzhu 2009-10-03
  • 打赏
  • 举报
回复
学习中
a8352081 2009-10-03
  • 打赏
  • 举报
回复
说的不清楚,不清楚,不清楚
starj1 2009-10-03
  • 打赏
  • 举报
回复
Application.DoEvents();
把这句插到扫描循环就可以做别的事了.

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧