Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果你不';是否处置HttpContext.Current.Items?_C#_Asp.net - Fatal编程技术网

C# 如果你不';是否处置HttpContext.Current.Items?

C# 如果你不';是否处置HttpContext.Current.Items?,c#,asp.net,C#,Asp.net,我正在使用HttpContext.Current.Items根据登录用户设置租户。为此,我使用以下代码: protected virtual void Application_BeginRequest() { HttpContext.Current.Items["_CurrentTenant"] = Tenant.GetCurrent(); } protected virtual void Application_EndRequest() { var currentTenant

我正在使用
HttpContext.Current.Items
根据登录用户设置租户。为此,我使用以下代码:

protected virtual void Application_BeginRequest()
{
    HttpContext.Current.Items["_CurrentTenant"] = Tenant.GetCurrent();
}

protected virtual void Application_EndRequest()
{
    var currentTenant = HttpContext.Current.Items["_CurrentTenant"] as Tenant;
    if (currentTenant != null)
        currentTenant.Dispose();
}
由于
HttpContext.Current.Items
仅存在于当前请求中,因此我希望它在请求完成后被销毁。另外,
CurrentTenant
对象是一个完全受管理的对象

因此,是否需要在
EndRequest
中进行处理?如果你不这样做会怎么样

因此,是否需要在EndRequest中进行处理

只有您才能知道,在请求结束时处理对象是否是您想要的。当它不再使用时,确保它被处理掉。如果是在请求的末尾,那么这可能是一个好位置

如果你不这样做会怎么样


不会调用
.Dispose()
方法。这对你特定的班级意味着什么,只有你能说。正常模式将在终结器中调用
.Dispose()
,但在此之前,可能需要一段时间。当时发生的事情完全取决于为什么首先将其标记为
IDisposable
。可能文件没有关闭,连接可能保持打开状态,句柄可能不会返回。。。只有你才能知道这是不是你的课。

为什么不试试呢?注释掉你正在处理它的行并尝试它当然我试过了,但没有明显的效果。例如,我想知道省略它是否会导致内存泄漏。另外,如果租户对象不是一次性的,是否有意义。您最后一句话“同样,如果租户对象不是一次性的,是否有意义”是否是IDisposable类型的租户对象?容器可能会被销毁,但如果您提取对某个项的引用并将其存储在其他位置,只要您保持对该项的引用,该项就会一直保持活动状态。经验法则:如果某个对象继承自IDisposable,则在其超出范围时始终将其处置。如果没有,让GC处理它租户对象不会从iDisposable继承。那么在这种情况下,我可以假设GC会处理它,而您不需要处理它(即使它存在于HttpContext.Current.Items中)?恐怕我不理解您的问题。如果未实现IDisPoble,则无法对其进行处置。你是说“垃圾收集”吗?是的,这是自动发生的,当对每个对象的最后一次引用超出范围时对其进行处理。@MartindeRuiter是的,您只需要处理具有IDisposable的对象和该接口这样做的对象,因为它们可能会占用昂贵的资源,例如数据库连接。我基本上担心如果您只在BeginRequest,不要将其移除、处置或垃圾收集到任何地方(例如EndRequest),否则会导致内存泄漏。或者,如果您使用完全托管的代码(我的租户对象是什么),GC会处理它吗?