C# 如何删除在Task.Factory.StartNew上创建的任务

C# 如何删除在Task.Factory.StartNew上创建的任务,c#,.net,task,C#,.net,Task,我使用以下代码创建任务 但似乎当应用程序关闭时,任务仍在内存中 如何正确删除在Task.Factory.StartNew上创建的任务 谢谢 class Service() Task job; void DoJob() { job = (Task.Factory.StartNew(() => { try { }

我使用以下代码创建任务

但似乎当应用程序关闭时,
任务仍在内存中

如何正确删除在Task.Factory.StartNew上创建的任务

谢谢

class Service()

 Task job;

void DoJob()
{

job = (Task.Factory.StartNew(() =>
                  {

                      try
                      {


                      }
                      catch (Exception ex)
                      {

                      }


                  }, TaskCreationOptions.AttachedToParent));
            }

当进程退出时,操作系统将释放该进程持有的所有资源。所有内存都被释放。这个清理程序非常可靠。您可以假定任务所保留的内存已正确清理


你所看到的一切——你误解了它。

当一个进程退出时,操作系统会释放该进程所拥有的所有资源。所有内存都被释放。这个清理程序非常可靠。您可以假定任务所保留的内存已正确清理


你所看到的一切-你误解了它。

默认情况下,
任务
作为后台线程运行,这意味着你的
任务
应该在应用程序退出时消失。

默认情况下,
任务
作为后台线程运行,这意味着您的
任务
应该在应用程序退出时消失。

任务包含一个可识别的等待句柄。因此,该任务也是可识别的,如果您不再需要它,则需要对其进行处置

但是,只有当您真正直接访问任务的WaitHandle(.NET 4.5)时,才必须处理该任务。在.NET 4.0之前的版本中,当您直接调用一个Waitx()方法或句柄时,必须调用dispose


但是当对象从内存中清除时,IDisposable没有影响。这是垃圾收集的工作,让garbabe收集完成他的工作。

任务包含一个可IDisposable的WaitHandle。因此,该任务也是可识别的,如果您不再需要它,则需要对其进行处置

但是,只有当您真正直接访问任务的WaitHandle(.NET 4.5)时,才必须处理该任务。在.NET 4.0之前的版本中,当您直接调用一个Waitx()方法或句柄时,必须调用dispose



但是当对象从内存中清除时,IDisposable没有影响。这是垃圾收集的工作,让garbabe收集完成它的工作。

当我关闭应用程序时,我在TaskManager中看不到EXE,但同时我有时无法从文件夹中删除该EXE。@ClarkKent为什么你认为这与内存有关?问一个新问题:“为什么我不能在exe退出后删除它?”@Clark Kent:如果你想看看哪个进程对文件有一个打开的句柄,你可以使用一个叫做process Explorer的工具。它是SYSTINTERNATERS套件的一部分:当我关闭应用程序时,我在TaskManager中看不到EXE,但同时我有时无法从文件夹中删除该EXE。@ClarkKent为什么你认为这与内存有关?问一个新问题:“为什么我不能在exe退出后删除它?”@Clark Kent:如果你想看看哪个进程对文件有一个打开的句柄,你可以使用一个叫做process Explorer的工具。它是SYSTINTERNATERS套件的一部分:您如何看到任务仍在内存中?流程是否仍在列表中?当进程终止时,其中的所有线程和对象也将终止。如果进程仍然存在,您确定在没有任务的情况下也不会发生这种情况吗?@BoasEnkler当我关闭应用程序时,我在TaskManager中看不到EXE,但同时我有时无法从文件夹中删除该EXE。好的,可能只是一些haning文件句柄。您可以使用FileMon来观察谁在锁定文件。这些挂起的文件句柄通常在第二次显示后消失。您是否看到任务仍在内存中?流程是否仍在列表中?当进程终止时,其中的所有线程和对象也将终止。如果进程仍然存在,您确定在没有任务的情况下也不会发生这种情况吗?@BoasEnkler当我关闭应用程序时,我在TaskManager中看不到EXE,但同时我有时无法从文件夹中删除该EXE。好的,可能只是一些haning文件句柄。您可以使用FileMon来观察谁在锁定文件。在后台线程(特别是线程池线程)中执行使用
Task.Run
创建的一些次要任务后,这些挂起的文件句柄通常会消失。使用
Task.Run
创建的任务在后台线程(特别是线程池线程)中执行。即使在整个流程退出时,这也无关紧要。不管对象是否被处置,内存都会被回收。这里可能与此无关,但最好知道何时处理任务,并想知道为什么任务是可识别的。如果您想分享一些您认为有用的信息,但这并不能回答所问的问题,你应该发表评论,或者甚至可能找到一个信息与主题相关的问题,而不是仅仅为了讨论非主题的切线而发表答案。抱歉,我用这篇文章回答了“如何删除在Task.Factory.StartNew上创建的任务”的问题。什么也不做,让垃圾收集完成他的工作。如果有人读了这个问题,他可能会发现这个答案是有用的。当整个过程结束时,即使是这个答案也无关紧要。不管对象是否被处置,内存都会被回收。这里可能与此无关,但最好知道何时处理任务,并想知道为什么任务是可识别的。如果您想分享一些您认为有用的信息,但这并不能回答所问的问题,你应该发表评论,或者甚至可能找到一个信息与主题相关的问题,而不是仅仅为了讨论非主题的切线而发表答案。抱歉,我用这篇文章回答了“如何删除在Task.Factory.StartNew上创建的任务”的问题。什么也不做,让垃圾收集完成他的工作。如果有人读了这个问题,他可能会发现这个答案很有用。