首页 > 解决方案 > 来自列表 C# 的对象自毁

问题描述

我想创建做一些工作的对象,在工作完成并且经过一段时间后它会自我毁灭。我已经写了一些东西,但不知道它是否会像我想要的那样工作。我在我的项目 .NET Core 2.1 中使用 MVC 结构

我上课了:

public class DestroableBackroundWorker : IDestroableBackroundWorker
{       
    public int Quantity { get; set; }
    public int Successful { get; set; }
    public int Waiting { get; set; }
    public int Unsuccessful { get; set; }
    public bool Done { get; set; }
    public string Output { get; set; }
    public string ID { get; set; }

    public DestroableBackroundWorker (string jsonobject, string ID)
    {
        this.ID = ID;            
        Task.Run(() => Working(jsonobject));
        Task.Delay(3600000).ContinueWith(t => destroyme());
    }

    private void Working(string jsonobject)
    {        
        try
        {
            //does work here, updates parameters of itself, to be able to see progress
            Done = true;
            Task.Delay(120000).ContinueWith(t => destroyme());                
        }
        catch
        {
            Done = true;
            Task.Delay(120000).ContinueWith(t => destroyme());
        }
    }        

    public void destroyme()
    {
        Project.Controllers.API.BackgroundUploads.Remove(this);
    }
}

我的 API 控制器中也有这个列表:

public static List<IDestroableBackroundWorker> BackgroundUploads = new List<IDestroableBackroundWorker>();

我从 API 端点启动对象,如下所示:

string ID = Guid.NewGuid().ToString();
BackgroundUploads.Add(new DestroableBackroundWorker(info, ID));
return Json(ID);

如果我想检查进度,我会这样做:

foreach (IDestroableBackroundWorker Worker in BackgroundUploads)
{
   if (Worker.ID == ID) {
      var Responce = new { All = Worker.Quantity, Success = Worker.successful, Unsuccess = Worker.unsuccessful };
      return Json(Responce);
   }
}
return Json(false);

我想在工作完成后 2 分钟或创建对象 1 小时后销毁该对象,这可以正常工作吗?我测试了它按预期工作,它从BackgroundUploads列表中删除了自己。我还注意到,在它从该列表中删除自身之后,它仍然可以工作,如果它还没有完成的话。

我的问题包括两部分:

标签: c#classasp.net-coreasp.net-core-mvc

解决方案


记住垃圾收集器的目的是什么;它是为了让您摆脱不必担心对象是否仍在占用内存的负担。所以不用担心!

让 GC 完成它的工作。它将为您管理对象生命周期。当您的程序不再能够访问该对象时,因为对该对象的引用不再位于已知有效的内存中,该对象的内存将在 GC 根据其策略选择时被回收。

每个进程都有数 TB的地址空间。不要担心确保尽快释放几十个字节。几秒钟后释放的那十几个字节不会影响成功与失败。


推荐阅读