我正在使用ASP.NET。当我运行新任务时,该任务将在什么时候终止?当调用它的线程终止时,它会终止吗?还是继续执行,直到它在我的lambda表达式中完成了代码的运行?
以下是我要执行的操作的示例:
Task.Run(() =>
{
try
{
MyFunction();
}
catch (Exception ex)
{
Console.Write(ex);
}
});
MyFunction()不返回任何内容,我只是希望它开始自己运行,以便当前线程可以继续运行。当我运行我的应用程序并调用此代码时,它似乎工作正常。我只是想看看我是否应该担心任务自发终止,或者我会很好。
我还应该提到,发出请求的线程可能会在任务完成之前终止。
谢谢。
答案 0 :(得分:2)
任务执行完要执行的代码后,其生命将立即结束。
当任务超出范围时,如果没有剩下要执行的代码,它将最终由垃圾收集器清理
几乎没有充分的理由说明为什么除非抛出异常并且无法捕获异常,否则任务应该突然结束。
.net。不要掷骰子来终止任务,否则它们将毫无用处。只要他们需要生存,他们就可以生存,并在此后不久终止。
从技术上讲,这将使用线程池线程并将其返回到池中,但是它们只是语义
答案 1 :(得分:0)
Task
可能有也可能没有线程,但是在您的情况下,Task.Run
应该有线程。您可以引用Task
本身,只要它在范围内,它就会一直存在,或者您可以对其进行实时引用。针对它运行的线程将继续运行,直到代码完成。有点令人困惑,但是知道Task
本身和运行线程是分开的。 Task
更像是某些工作的状态/管理器,它可以或可以不在单独的线程上。如果需要,可以保留此引用,直到应用程序终止为止,即使您已完成,也可以在其中读取工作状态。
如果Task
离开范围,并且没有参考,它将继续监视它所监视的工作单元;但是,Task
本身将在完成后设置为垃圾回收。换句话说,您可以根据需要解雇Task
,并且除非出现错误或结束应用程序,否则分配给Task
的工作单元将完成。
请注意,Task
将随您的应用程序终止,并且如果Task
确实产生了一个新线程,例如您对Task.Run
所做的操作,则如果该应用程序终止结束。