Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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中等待线程#_C#_Multithreading - Fatal编程技术网

C# 主线程在c中等待线程#

C# 主线程在c中等待线程#,c#,multithreading,C#,Multithreading,我想让主线程生成线程,并且能够在不等待所有线程完成的情况下继续生成更多线程。线程的生成由用户控制,因此用户可以在不同的时间段添加更多线程 问题是。。。当主线程正在运行finalize时,如何执行此操作。在finalize中,使其等待所有活动线程完成。跟踪所有创建的线程;例如,通过列表集合。使用finalize方法时,只需迭代所有线程并按顺序调用它们的Join方法,如下面的WaitForThreads方法所示: private readonly List<Thread> threads

我想让主线程生成线程,并且能够在不等待所有线程完成的情况下继续生成更多线程。线程的生成由用户控制,因此用户可以在不同的时间段添加更多线程


问题是。。。当主线程正在运行finalize时,如何执行此操作。在finalize中,使其等待所有活动线程完成。

跟踪所有创建的线程;例如,通过
列表
集合。使用
finalize
方法时,只需迭代所有线程并按顺序调用它们的
Join
方法,如下面的
WaitForThreads
方法所示:

private readonly List<Thread> threads = new List<Thread>();

public void SpawnThread(Action action)
{
    Thread thread = new Thread(new ThreadStart(action));
    thread.IsBackground = false;
    threads.Add(thread);
    thread.Start();
}

private void WaitForThreads()
{
    foreach (Thread thread in threads)
        thread.Join();
}
private readonly List threads=new List();
公共空产卵线程(操作)
{
线程线程=新线程(新线程开始(操作));
thread.IsBackground=false;
线程。添加(线程);
thread.Start();
}
私有void WaitForThreads()
{
foreach(线程中的线程)
thread.Join();
}
阻止调用线程(应该是主线程),直到特定线程终止。如果线程已经终止,那么调用将立即返回(这就是为什么在终止时不需要从收集中删除线程,尽管为了垃圾收集,仍然需要这样做)


此外,您还应该考虑为什么需要等待线程在<代码>终结FialIt>/Cult>方法中终止。如果只是为了防止它们在主线程终止时被强制中止,那么就没有必要了;在属性为

false
的所有线程完成执行之前,进程将保持活动状态(即使没有窗口)。垃圾收集也是如此;除非不再从任何活动线程(而不仅仅是主线程)引用堆对象,否则堆对象将无法最终确定。

这是关于正确使用.join()方法的问题吗?您的问题中缺少一点:您说过用户可以在不同的时间段添加线程。我的问题是:在等待用户时,主线程将做什么?主线程如何知道用户没有更多的线程要添加?我真的不需要线程。Join,因为我不需要从线程返回任何内容。我所需要的就是让主线程准备好接收越来越多的线程,而生成的线程完成工作。这是如此有趣的代码,我有工作很好。我缺少的是IsBackground=false;线路。这是真的,所以当主线程终止时,派生线程也随之终止。在这种上下文中使用术语“背景”是误导性的。开发人员通常在开始时假设除主线程外,所有线程都是后台线程。很高兴能帮忙!