当前位置: 代码迷 >> C# >> C#怎样判断线程执行完毕?请看详细说明,该如何解决
  详细解决方案

C#怎样判断线程执行完毕?请看详细说明,该如何解决

热度:9   发布时间:2016-05-05 04:01:50.0
C#怎样判断线程执行完毕?请看详细说明
我写了一个迭代遍历算法,遍历系统所有文件来寻找一个文件,首先求大神们尽量不要说你有更好的方法咱们就事论事话虽不好听但是我不想提个问结果被教育了。。。
[百度提问真心坑总是说超出长度]
上代码:
        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 { }
        }

同时在每个磁盘中找速度快了很多,突然发现问题来了,如果没搜索到结果肿么办,我该肿么知道捏
------解决思路----------------------
最好不要把递归直接当线程函数执行,那样会不断的进入,不断的退出,不好判断什么时候是真正全部执行完了退出的

当然你可以加个bool值判断一下是最外层的递归,还是内层的递归,不过要在每层递归里都传入这个参数,比较麻烦

简单点的办法就是再写个方法,把递归放里面
这个方法作为线程函数执行,它执行完了,那么线程函数就是真正执行完了
------解决思路----------------------
当然你也可以在一个新线程里循环开启你之前的那些线程
然后在新线程里加个thread.Join()来同步,就可以判断什么时候线程全部执行完了(没执行完之前会阻塞在这一句)

避免在主线程里加入阻塞代码,那样你所有的Console.WriteLine也都被阻塞,要等全部执行完了才会有显示了
------解决思路----------------------
 thread.IsAlive
  相关解决方案