c# - 来自列表 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
列表中删除了自己。我还注意到,在它从该列表中删除自身之后,它仍然可以工作,如果它还没有完成的话。
我的问题包括两部分:
- 这可以吗?,如果工作完成然后它从列表中删除自己,那个对象消失了吗?我的意思是它不会使用任何内存或空间吗?
- 即使它仍然做某种工作,如何删除它,不是删除指针,而是使该对象不再使用内存,空间,处理器,停止做任何工作,然后消失了。
解决方案
记住垃圾收集器的目的是什么;它是为了让您摆脱不必担心对象是否仍在占用内存的负担。所以不用担心!
让 GC 完成它的工作。它将为您管理对象生命周期。当您的程序不再能够访问该对象时,因为对该对象的引用不再位于已知有效的内存中,该对象的内存将在 GC 根据其策略选择时被回收。
每个进程都有数 TB的地址空间。不要担心确保尽快释放几十个字节。几秒钟后释放的那十几个字节不会影响成功与失败。
推荐阅读
- java - 为什么默认情况下不使用 intern() 创建新字符串?
- php - 使用 SQL datetime 默认 current_timestamp 和格式化
- mysql - 获取拍手的 SUM() 并同时在一个查询中计算书签
- java - 服务器不会连接到多个客户端(Java)
- latex - 将页面划分为块/部分
- javascript - 如果找到特定值,如何停止在 EventBus 中发送数据?
- php - 从php在ubuntu上执行比特币应用程序的命令-没有结果
- c# - 在 asp.net core 中找不到视图
- wordpress - 技术支持:Elementor pro 我们如何在邮箱中删除?
- c# - Solidworks API AddMenuItem