Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 启动同一线程两次-第一次完成后的第二次_C#_Multithreading_Thread Safety - Fatal编程技术网

C# 启动同一线程两次-第一次完成后的第二次

C# 启动同一线程两次-第一次完成后的第二次,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,所以我做了一个线程,它执行一个函数,这个函数依赖于一个全局变量。之后,我想更改该变量并再次运行线程,以便它使用另一个参数再次执行我的过程。问题是,我似乎不知道我的线程何时完成。在谷歌搜索了很多次之后,我发现没有什么能帮到我。这里有人能帮忙吗?提前谢谢。一些代码将不胜感激。这是我的: //temp_folder is global variable temp_folder = APPDATA + "Local" + "\\" + "Temp\\"; Thread oThread = new T

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

//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();
这是一个干净的临时程序。是的,这是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);
}
}
您可以使用来确保线程已完成

例如:

您可以使用来确保线程已完成

例如:


如果您使用的是C5,请尝试在任务中包装线程。任务提供了一个名为“ContinueWith”的方法,您可以在其中再次调用线程。或者使用'await'进行异步调用。

如果您使用的是C5,请尝试将线程包装到任务中。任务提供了一个名为“ContinueWith”的方法,您可以在其中再次调用线程。或者使用“wait”的异步调用

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

在大多数情况下,您可以使用。任务为您提供了一种非常简洁的方法来定义异步执行的操作,然后在完成时执行其他操作

因此,您可能可以执行类似以下伪代码的操作:

var task = new Task(clean_temp);
task.ContinueWith(update_global_variable);
task.ContinueWith(clean_temp);
task.Wait();
实际的代码不会完全像这样,但是我们的想法是定义一些应该做的事情,调用clean\u temp,然后定义在第一个任务完成后要做的事情,更新\u global\u变量,依此类推。您可以链接任意数量的操作

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

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

如果修改clean_temp方法以获取指定要清理的文件夹的输入参数,则可以再次执行以下操作,伪代码!!!:

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

更干净、更安全:-

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

在大多数情况下,您可以使用。任务为您提供了一种非常简洁的方法来定义异步执行的操作,然后在完成时执行其他操作

因此,您可能可以执行类似以下伪代码的操作:

var task = new Task(clean_temp);
task.ContinueWith(update_global_variable);
task.ContinueWith(clean_temp);
task.Wait();
实际的代码不会完全像这样,但是我们的想法是定义一些应该做的事情,调用clean\u temp,然后定义在第一个任务完成后要做的事情,更新\u global\u变量,依此类推。您可以链接任意数量的操作

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

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

如果修改clean_temp方法以获取指定要清理的文件夹的输入参数,则可以再次执行以下操作,伪代码!!!:

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

更干净、更安全:-

更好地使用,IMO。主线程是Windows GUI应用程序的一部分吗?或者,当清理发生时,你打算做其他事情吗?你可以考虑使用一个任务,它有一个连续的方法。是的,它是Windows GUI应用程序的一部分。它会清理临时文件夹,并在标签中统计清除的文件。最好使用,IMO。主线程是Windows GUI应用程序的一部分吗?或者,当清理发生时,你打算做其他事情吗?你可以考虑使用一个任务,它有一个连续的方法。是的,它是Windows GUI应用程序的一部分。它会清理临时文件夹,并在标签中统计清除的文件。尝试过此操作,但由于某种原因,我的程序会在执行此操作时冻结:/Join会使主线程等待线程完成,所以程序会冻结。@DivineNeos:您能给我们看一下您的clean_temp实现吗?尝试过此操作,但出于某种原因,当我执行此操作时,我的程序会冻结:/Join会使主线程等待线程完成,所以程序会冻结。@DivineNeos:能否向我们展示您的clean_temp实现?该应用程序是Windows GUI应用程序的一部分。它会清理临时文件夹,并统计标签中清除的文件数。当我写这样的东西时,它冻结了:你知道为什么吗?var任务=新任务清理温度;tasktask2=Task.ContinueWithcontinuation=>{temp\u folder=APPDATA+Local+\\\\+temp\\;};Task task3=Task.ContinueWithcontinuation=>{clean_temp;};任务,等等;您的代码非常复杂,为什么要执行方法。例如调用调用?因此很难说清楚。您应该使用调试器,看看会发生什么。此外,您还有一个尝试捕获,它在捕获中不起任何作用。你可以拥有所有的k
里面也有很多错误。现在我编辑了代码,我把我的线程包装在任务中,它不再工作了。你知道怎么解决这个问题吗?因为我认为问题在于它是一个GUI应用程序。你能发布一个更新的代码示例吗?它是gui应用程序这一事实通常不会影响任何事情。该应用程序是Windows gui应用程序的一部分。它会清理临时文件夹,并统计标签中清除的文件数。当我写这样的东西时,它冻结了:你知道为什么吗?var任务=新任务清理温度;tasktask2=Task.ContinueWithcontinuation=>{temp\u folder=APPDATA+Local+\\\\+temp\\;};Task task3=Task.ContinueWithcontinuation=>{clean_temp;};任务,等等;您的代码非常复杂,为什么要执行方法。例如调用调用?因此很难说清楚。您应该使用调试器,看看会发生什么。此外,您还有一个尝试捕获,它在捕获中不起任何作用。你可能也有各种各样的错误。现在我编辑了代码,我把我的线程包装在任务中,它不再工作了。你知道怎么解决这个问题吗?因为我认为问题在于它是一个GUI应用程序。你能发布一个更新的代码示例吗?事实上,它是一个gui应用程序,通常不会影响任何事情。