C#任务何时终止?

时间:2018-11-26 21:45:42

标签: c# asp.net multithreading task

我正在使用ASP.NET。当我运行新任务时,该任务将在什么时候终止?当调用它的线程终止时,它会终止吗?还是继续执行,直到它在我的lambda表达式中完成了代码的运行?

以下是我要执行的操作的示例:

Task.Run(() =>
{
    try
    {
        MyFunction();
    }
    catch (Exception ex)
    {
        Console.Write(ex);
    }
});

MyFunction()不返回任何内容,我只是希望它开始自己运行,以便当前线程可以继续运行。当我运行我的应用程序并调用此代码时,它似乎工作正常。我只是想看看我是否应该担心任务自发终止,或者我会很好。

我还应该提到,发出请求的线程可能会在任务完成之前终止。

谢谢。

2 个答案:

答案 0 :(得分:2)

  1. 任务执行完要执行的代码后,其生命将立即结束。

  2. 当任务超出范围时,如果没有剩下要执行的代码,它将最终由垃圾收集器清理

几乎没有充分的理由说明为什么除非抛出异常并且无法捕获异常,否则任务应该突然结束。

.net。不要掷骰子来终止任务,否则它们将毫无用处。只要他们需要生存,他们就可以生存,并在此后不久终止。

从技术上讲,这将使用线程池线程并将其返回到池中,但是它们只是语义

https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming

答案 1 :(得分:0)

Task可能有也可能没有线程,但是在您的情况下,Task.Run应该有线程。您可以引用Task本身,只要它在范围内,它就会一直存在,或者您可以对其进行实时引用。针对它运行的线程将继续运行,直到代码完成。有点令人困惑,但是知道Task本身和运行线程是分开的。 Task更像是某些工作的状态/管理器,它可以或可以不在单独的线程上。如果需要,可以保留此引用,直到应用程序终止为止,即使您已完成,也可以在其中读取工作状态。

如果Task离开范围,并且没有参考,它将继续监视它所监视的工作单元;但是,Task本身将在完成后设置为垃圾回收。换句话说,您可以根据需要解雇Task,并且除非出现错误或结束应用程序,否则分配给Task的工作单元将完成。

请注意,Task将随您的应用程序终止,并且如果Task确实产生了一个新线程,例如您对Task.Run所做的操作,则如果该应用程序终止结束。