gpt4 book ai didi

asp.net - 异步任务 ASP.net HttpContext.Current.Items 为空 - 如何处理此问题?

转载 作者:行者123 更新时间:2023-12-02 11:13:10 27 4
gpt4 key购买 nike

我们正在 asp.net MVC .NET 4.0 中运行一个非常大的 Web 应用程序。最近我们进行了一次审计,性能团队表示存在大量空引用异常。

所以我开始从转储和事件查看器中调查它。我的理解如下:

我们在 Controller 中使用 Asyn 任务。我们依靠 HttpContext.Current.Items 哈希表来存储大量应用程序级别的值。

Task<Articles>.Factory.StartNew(() =>
{
System.Web.HttpContext.Current = ControllerContext.HttpContext.ApplicationInstance.Context;
var service = new ArticlesService(page);
return service.GetArticles();
}).ContinueWith(t => SetResult(t, "articles"));

因此,我们将上下文对象复制到从任务工厂生成的新线程上。只要有必要,这个 context.Items 就会在线程中再次使用。比如说:

public class SomeClass
{
internal static int StreamID
{
get
{
if (HttpContext.Current != null)
{
return (int)HttpContext.Current.Items["StreamID"];
}
else
{
return DEFAULT_STREAM_ID;
}
}
}

只要并行请求的数量是最佳的,它就可以正常运行。我的问题如下:

<强>1。当负载较多且并行请求过多时,我注意到 HttpContext.Current.Items 为空。我无法找出原因,这会导致所有空引用异常。

<强>2。我们如何确保它不为 null ?有什么解决方法吗?

注意:我在 StackOverflow 中通读,人们有诸如 HttpContext.Current 为空之类的问题 - 但就我而言,它不是 null 并且是空的。我正在阅读另一篇文章,其中作者说有时请求对象会被终止,并且可能会导致问题,因为已经在对象上调用了 dispose。我正在做 Context 对象的副本 - 它只是浅副本而不是深副本。

最佳答案

您的问题是 HttpContext 的实例成员不是线程安全的:

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

当以您正在执行的方式(多线程)访问它时,您需要进行自己的同步。

static object locker = new object();
get
{
lock (locker)
{
if (HttpContext.Current != null)
{
return (int)HttpContext.Current.Items["StreamID"];
}
else
{
return DEFAULT_STREAM_ID;
}
}
}

MSDN: system.web.httpcontext

关于asp.net - 异步任务 ASP.net HttpContext.Current.Items 为空 - 如何处理此问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25300005/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com