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

时间:2018-06-19 22:04:27

标签: 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 takes 20 seconds to run
    }
    ...doing something
}

1 个答案:

答案 0 :(得分:0)

这取决于您的应用程序环境(例如ASP.NET,WPF,控制台应用程序等)。在许多类型的应用程序中,background tasks/threads will be killed once all the foreground tasks go out of scope。在这些环境中,最好是跟踪任务并确保所有任务都已完成,然后再关闭主线程。

在某些环境中,例如ASP.NET,there are specific recommended ways to start a background task。这些可以将取消令牌传递到后台任务的回调委托中,因此当服务器即将关闭时,环境可以向所有仍在运行的任务发送取消消息。

如果您要编写类库,则必须决定最合适的方法:亲自等待所有任务(可能在所有任务开始后都在Task.WhenAll中),或者为自己设定期望API,以便使用者可以将环境的关闭事件与正在运行的任务联系起来。