如果此任务超出C#中的范围,会发生什么情况?

如果此任务超出C#中的范围,会发生什么情况?,c#,multithreading,scope,task,C#,Multithreading,Scope,Task,我想创建一个任务,为列表中的每个项目运行foo函数。在下面的代码中,我们假设函数Foo运行需要20秒。当任务完成时,主线程将退出创建任务t的作用域。当任务t超出主线程的作用域时,主线程会删除线程t吗 void CreateTaskAndRun() { ...doing something foreach(DummyClass obj in objList) { Task t = new Task(obj.Foo); t.Start(); /

我想创建一个任务,为列表中的每个项目运行foo函数。在下面的代码中,我们假设函数Foo运行需要20秒。当任务完成时,主线程将退出创建任务t的作用域。当任务t超出主线程的作用域时,主线程会删除线程t吗

void CreateTaskAndRun()
{
    ...doing something
    foreach(DummyClass obj in objList)
    {
        Task t = new Task(obj.Foo);
        t.Start(); //Foo takes 20 seconds to run
    }
    ...doing something
}

它取决于您的应用程序环境(例如ASP.NET、WPF、控制台应用程序等)。在许多类型的应用程序中。在这些环境中,最好跟踪任务并确保它们在允许主线程关闭之前全部完成

在某些环境中,如ASP.NET。它们可以将取消令牌传递到后台任务的回调委托中,以便环境可以向服务器即将关闭时仍在运行的所有任务发送取消消息


如果你正在编写类库,你必须决定什么是最合适的:自己等待所有任务(可能在
任务中。当所有任务都启动后,
),或者使用API设置期望值,以便使用者可以将其环境的关闭事件与正在运行的任务联系起来。

任务本身不是线程。任务是可由托管线程池中的一个线程处理的工作单元。任务的结束不是线程的结束,线程的结束将仍然可用于执行其他任务。此外,您还可以保留对任务的引用,以便等待并响应任务的完成。如果不这样做,该任务仍然存在并将继续执行。完成后,我想它会像其他东西一样被垃圾收集。关于这方面的一些解释和一些例子,可以在中找到。它只是一个c#库@GolezTrol回答了我的问题。