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应用程序,通常不会影响任何事情。