C# 线程,中止并等待

C# 线程,中止并等待,c#,multithreading,C#,Multithreading,我正在中止一个线程,它很快就会成为线程,问题是我需要暂停,直到所有线程都中止 执行线程后。中止;我想使用Thread.Join来等待它被完全中止。然而,这是行不通的。它只是永远等待。如何中止每个线程并等待其完成后再继续 附加信息:如果您好奇为什么-在本例中,我关闭了一个窗口,我将委托func传递到线程中,当它完成或中止时,它将调用该线程。如果我不暂停,那么窗口将关闭,函数将调用无效句柄/obj。我可以很容易地使用相同的方法,插入一个标志,然后循环并休眠,直到所有标志都设置好,但感觉不对劲。我从多

我正在中止一个线程,它很快就会成为线程,问题是我需要暂停,直到所有线程都中止

执行线程后。中止;我想使用Thread.Join来等待它被完全中止。然而,这是行不通的。它只是永远等待。如何中止每个线程并等待其完成后再继续


附加信息:如果您好奇为什么-在本例中,我关闭了一个窗口,我将委托func传递到线程中,当它完成或中止时,它将调用该线程。如果我不暂停,那么窗口将关闭,函数将调用无效句柄/obj。我可以很容易地使用相同的方法,插入一个标志,然后循环并休眠,直到所有标志都设置好,但感觉不对劲。

我从多年的线程经验中了解到,有两条规则,如果遵循这些规则,生活会轻松得多

与这个问题相关的一个问题是:

让线程控制自己的资源,包括它们的生存期。 我不会中止一个线程,我只是在线程创建者和线程本身之间设置一个通信方法来通知线程终止,然后让线程本身关闭

此方法通常可以像控制线程主循环的write by creator/read by thread标志一样简单。如果线程在循环中有长时间运行的任务,还应该定期检查


然后创建者线程应该直接加入,直到线程退出。如果设计得当,您可以设置所需时间的上限。

使用事件等同步对象。例如,每个后台线程都有一个与之关联的事件。当线程终止时,它向事件发送信号。主线程对事件集执行WaitHandle.WaitAll,并且仅当所有事件都发出信号时才继续

请注意,如果后台线程可能需要很长时间才能终止,那么在等待主线程时阻塞主线程将创建糟糕的用户体验。因此,如果是这种情况,您可能希望在阻塞之前隐藏窗口。此外,您还需要测试这对回调委托的影响——如果UI线程在等待过程中被阻塞,它是否能够处理您的委托

如果线程由于窗口关闭而被终止,那么不调用委托不是更好的设计吗?只要让主线程告诉后台线程终止的原因,如果原因是窗口关闭,就让它们跳过回调。这假设您正在和线程通信,正如Pax正确建议的,而不仅仅是调用Abort