启动同一个线程两次,第二次是在第一个线程完成后

本文关键字:线程 第一个 第二次 两次 同一个 启动 | 更新日期: 2023-09-27 18:20:15

所以我制作了一个线程,它执行一个依赖于全局变量的函数。之后,我想更改该变量并再次运行线程,以便它使用另一个参数再次执行我的过程。问题是,我似乎不知道我的线程是什么时候完成的。在谷歌上搜索了很多之后,我没有发现任何能帮助我的东西。这里有人能帮忙吗?提前谢谢。请提供一些代码。这是我的:

//temp_folder is global variable
temp_folder = APPDATA + "Local" + "''" + "Temp''";
Thread oThread = new Thread(new ThreadStart(clean_temp));
oThread.Start();
//Here I should wait for this oThread to finish, then change the temp_folder
//variable mentioned in comment down and start once again
//temp_folder = WINDIR + "''" + "Temp''";
//oThread.Start();

下面是一个clean_temp()过程。是的,这就是GUI应用程序。

public void clean_temp()
{
DirectoryInfo directory = new DirectoryInfo(temp_folder);
try
{
    DirectoryInfo[] folders = directory.GetDirectories();
    foreach (DirectoryInfo folder in folders)
    {
        temp_folder = temp_folder + folder.Name + "''";
        clean_temp();
        temp_folder = temp_folder.Replace(folder.Name + "''", "");
    }
}
catch { }
long sz;
double size, trenutna;
foreach (FileInfo file in directory.GetFiles())
{
    sz = file.Length;
    size = (double)sz / 1024.0;
    trenutna = Convert.ToDouble(lbl_junk_size.Text);
    trenutna += size;
    MethodInvoker mi_invoker_size_change = new MethodInvoker(()=> lbl_junk_size.Text = trenutna.ToString());
    lbl_junk_size.Invoke(mi_invoker_size_change);
    MethodInvoker mi_invoker_count_change = new MethodInvoker(() => lbl_junk.Text = (Convert.ToInt64(lbl_junk.Text) + 1).ToString());
    lbl_junk.Invoke(mi_invoker_count_change);
}
}

启动同一个线程两次,第二次是在第一个线程完成后

您可以使用Join()来确保您的线程已经完成。

例如:

Thread oThread = new Thread(new ThreadStart(clean_temp));
oThread.Start();
oThread.Join();

我认为你在这里问错了问题。与其问如何等待线程完成,不如看看如何在第一个线程完成后执行另一个操作。

在大多数情况下,您可以使用.Net中的Task API来完成此操作。Tasks为您提供了一种非常干净的方法来定义要异步执行的操作,然后在操作完成后执行其他操作。

所以你可能会做一些类似伪代码的事情:

var task = new Task(clean_temp);
task.ContinueWith(update_global_variable);
task.ContinueWith(clean_temp);
task.Wait();

实际的代码不会完全是这样的,但我们的想法是,你定义了一些应该做的事情(调用clean_temp),然后定义了第一个工作完成后要做的事情。(update_global_variable)等等。你可以链接你想要的任意多个操作。

这可能比自己处理线程要干净得多。

编辑:实际上,您可以通过去掉全局变量来进一步简化代码。

如果您修改clean_temp方法以接受指定要清理的文件夹的输入参数,那么您可以执行以下操作(同样是伪代码!!):

new Task(clean_temp, "C:'first temp folder")
   .ContinueWith(clean_temp, "C:'second folder")
   .Wait();

更清洁、更安全:-)

如果您使用的是C#5,请尝试将线程封装在任务中。任务提供了一个名为"ContinueWith"的方法,在该方法中您可以再次调用线程。或者使用"等待"进行异步调用