C# 任务生存期子项与父项

C# 任务生存期子项与父项,c#,task,C#,Task,我熟悉任务和线程,我已经知道了 这是我的密码: static void Main(string[] args) { var t = Task.Factory.StartNew(() => { Thread.Sleep(3000); Console.WriteLine("Child"); }, CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskSchedule

我熟悉任务和线程,我已经知道了

这是我的密码:

static void Main(string[] args)
{
    var t = Task.Factory.StartNew(() => {

        Thread.Sleep(3000);
        Console.WriteLine("Child");

    }, CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskScheduler.Default);

    Task.WaitAll(t);
    Console.WriteLine("Parent");
}
Console.WriteLine(“子”)
get called重新调用
Task.WaitAll(t)换句话说:有没有一种方法可以执行所有启动的子任务而不等待它们(并且在父线程完成执行后不会立即终止)?

一旦没有前台线程运行,C#程序就会终止
Task.Factory.StartNew
使用线程池线程来完成其工作,线程池线程都是后台线程,而不是前台线程,因此不会阻止整个程序终止

如果要确保整个程序不会终止,则需要确保至少有一个前台线程正在运行,这意味着要么让您在创建的
任务中执行的附加工作在前台线程中执行,要么让它在后台线程中执行(如果您希望该工作阻止应用程序终止,则这是适当的),或者这将意味着在现有的一个前台线程中等待其他线程完成。

一个C#程序将在没有前台线程运行时立即终止。
Task.Factory.StartNew
使用线程池线程来完成其工作,线程池线程都是后台线程,而不是前台线程,因此不需要t防止整个程序终止


如果要确保整个程序不会终止,则需要确保至少有一个前台线程正在运行,这意味着要么让您在创建的
任务中执行的附加工作在前台线程中执行,要么让它在后台线程中执行(如果您希望该工作阻止应用程序终止,则这是适当的),或者这将意味着在现有的一个前台线程中等待其他线程完成。

如果我使用线程并设置
thread.IsBackground=false;
?@Emaborsa您绝对不应该对线程池线程执行此操作。它是专门为具有后台线程而设计的,您不应该中断它;很可能是这样的最终导致问题。如果您正在创建自己的新线程,那么默认情况下它们将是前台线程。如果我使用线程并将
thread.IsBackground=false;
?@Emaborsa设置为线程池线程,您绝对不应该这样做。它是专门围绕后台线程设计的,您不应该中断如果您正在创建自己的新线程,那么默认情况下它们将是前台线程。