C#怎样判断线程执行完毕?请看详细说明

runerback 2015-04-22 10:11:00
我写了一个迭代遍历算法,遍历系统所有文件来寻找一个文件,首先求大神们尽量不要说你有更好的方法咱们就事论事话虽不好听但是我不想提个问结果被教育了。。。
[百度提问真心坑总是说超出长度]
上代码:
        private static void FindGamePath()
{
Console.Clear();
Console.WriteLine("Search Start.");
DriveInfo[] drives = DriveInfo.GetDrives();
foreach (DriveInfo drive in drives)
{
DirectoryInfo dirInfo = new DirectoryInfo(@drive.RootDirectory.ToString());
GetAllFiles((object)dirInfo);
_getFilesThread = new Thread(GetAllFiles);
_getFilesThread.IsBackground = true;
_getFilesThread.Start(dirInfo);
}

}

private static void GetAllFiles(object dirInfo)
{
DirectoryInfo info = (DirectoryInfo)dirInfo;
try{
info.Attributes = info.Attributes & ~FileAttributes.ReadOnly & ~FileAttributes.Hidden;
}catch { }
try{
FileInfo[] all_files = info.GetFiles();
count += all_files.Length;
FileInfo[] files = info.GetFiles("*.exe");
foreach (FileInfo file in files)
{
try{
if (File.Exists(file.FullName))
{
file.Attributes = file.Attributes & ~FileAttributes.ReadOnly & ~FileAttributes.Hidden;
Console.Clear();
Console.WriteLine(file.FullName);

if (file.Name == "OFDR.exe")
{
Console.WriteLine("Find In: {0}.", file.FullName);
_getFilesThread.Abort();
_getFilesThread.Join();
}
}
}catch { }
}
}catch { }
try
{
DirectoryInfo[] infos = info.GetDirectories();

if (infos.Length > 0)
{
try
{
foreach (DirectoryInfo info0 in infos)
{
GetAllFiles(info0);
}
}
catch (IOException ex) { Console.WriteLine(ex.Message); Thread.Sleep(5000); }
}
}
catch { }
}

同时在每个磁盘中找速度快了很多,突然发现问题来了,如果没搜索到结果肿么办,我该肿么知道捏
...全文
1777 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
runerback 2015-04-25
  • 打赏
  • 举报
回复
哪怕大概说个思路我也会给出所有分数
bbjiabcd 2015-04-23
  • 打赏
  • 举报
回复
定义一个公共的布尔型数组,每个线程对应一个数组的标志位,运行完后并且未找到文件,则将自身标志设为true,并判断数组中是否全是true,是的话提示“文件未找到”。这个数组必须同步。
  • 打赏
  • 举报
回复
引用 1 楼 shaoerbao 的回复:
每个线程里面的遍历函数运行完的标志是什么,想用 ManualResetEvent 里面的方法但发现无从下手
线程同步有多种规范的、一般人都会学到的方法。但是可能对你来说没用。
  • 打赏
  • 举报
回复
既然你无法接受任何与你代码不同的意见,那么想知道“没搜索到”,就只有你自己用眼睛看了,别人没办法。
sinat_20919149 2015-04-23
  • 打赏
  • 举报
回复
引用 11 楼 Z65443344 的回复:
[quote=引用 10 楼 sinat_20919149 的回复:] thread.IsAlive
不失为一种办法吧 不过用在这里真心不合适 楼主应该用回调或阻塞的思路,而不是循环反复去判断线程是不是活着,那样太傻了,效率也低[/quote] 是的 谢谢指点
於黾 2015-04-23
  • 打赏
  • 举报
回复
引用 10 楼 sinat_20919149 的回复:
thread.IsAlive
不失为一种办法吧 不过用在这里真心不合适 楼主应该用回调或阻塞的思路,而不是循环反复去判断线程是不是活着,那样太傻了,效率也低
sinat_20919149 2015-04-23
  • 打赏
  • 举报
回复
thread.IsAlive
於黾 2015-04-23
  • 打赏
  • 举报
回复
其实程序根本不需要判断出到底有没有搜素到结果 反正搜索到了就会有显示 你全部执行完了,提示个搜素完毕,用眼睛就能看出到底有没有搜到结果了
於黾 2015-04-23
  • 打赏
  • 举报
回复
当然你也可以在一个新线程里循环开启你之前的那些线程 然后在新线程里加个thread.Join()来同步,就可以判断什么时候线程全部执行完了(没执行完之前会阻塞在这一句) 避免在主线程里加入阻塞代码,那样你所有的Console.WriteLine也都被阻塞,要等全部执行完了才会有显示了
於黾 2015-04-23
  • 打赏
  • 举报
回复
最好不要把递归直接当线程函数执行,那样会不断的进入,不断的退出,不好判断什么时候是真正全部执行完了退出的 当然你可以加个bool值判断一下是最外层的递归,还是内层的递归,不过要在每层递归里都传入这个参数,比较麻烦 简单点的办法就是再写个方法,把递归放里面 这个方法作为线程函数执行,它执行完了,那么线程函数就是真正执行完了
runerback 2015-04-23
  • 打赏
  • 举报
回复
引用 4 楼 bbjiabcd 的回复:
定义一个公共的布尔型数组,每个线程对应一个数组的标志位,运行完后并且未找到文件,则将自身标志设为true,并判断数组中是否全是true,是的话提示“文件未找到”。这个数组必须同步。
我提问的原因就是不知道“运行完后”是哪里
runerback 2015-04-23
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
既然你无法接受任何与你代码不同的意见,那么想知道“没搜索到”,就只有你自己用眼睛看了,别人没办法。
我的意思是不要改遍历算法就行了,具体怎么写随便改
runerback 2015-04-22
  • 打赏
  • 举报
回复
每个线程里面的遍历函数运行完的标志是什么,想用 ManualResetEvent 里面的方法但发现无从下手

110,538

社区成员

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

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

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