CSharp - 在 Parallel.For 中调用的方法中,C# HttpContext为空

  显示原文与译文双语对照的内容

在尝试大量后发布这个问题。 做正常 for 不是一个选项 in,因为我们需要在较少的时间内进行大量的处理。

我有 GetDataFor(),里面有 HttpContext.Current

代码如下所示:


public void SomeMethod()


{


 var context = HttpContext.Current;



 Parallel.For(0, 100, i =>


 {


 var data = GetDataFor(i, context);


 });


}



public data GetDataFor(int i, HttpContext context)


{


 Uri requestUri = null;


 if (HttpContext.Current!= null)


 {


 requestUri = HttpContext.Current.Request.Url;


 sCookie = string.Format("{0}", HttpContext.Current.Request.Headers["cookie"]);


 }


 else


 {


 requestUri = context.Request.Url;


 }



//do something


 return data;


}



正常 for 循环内一切正常。 但是,在 Parallel.For 中调用它并传递 HttpContext.CurrentHttpContext.Current.RequestHttpContext.Current.Request.Url 作为方法参数:

HttpContext.Current 无法序列化,因为它没有无参数构造函数

通过HttpContextBase httpContext = null 当参数抛出时:

要进行XML序列化,从ICollection继承的类型必须在它的继承层次结构的所有级别都具有 Add(System.Object)的实现。 System.Web.HttpApplicationStateBase 不实现 Add(System.Object) 。

尝试创建属性:


public string[] httpContextData


{


 get


 {


 string requestUrl = HttpContext.Current.Request.Url.ToString();


 string sCookie = string.Format("{0}", HttpContext.Current.Request.Headers["cookie"]);


 return new string[] { requestUrl, sCookie };


 }


}



并在方法中使用:


var contextData = httpContextData;



引发:

System.Uri 无法序列化,因为它没有无参数构造函数

这是为了发送引用状态但是不能理解为什么这个问题没有解决。

如何在 Parallel.For 内使用 HttpContext.Current? 我 在 这儿 写错 了 吗?

此外,所需的内容是:

HttpContext.Current.Request.UrlHttpContext.Current.Request.Headers["cookie"]

时间: 原作者:

HttpContext.Current 仅在请求处理线程可用。 Parallel.For 创建多个线程,其中任何一个都不能访问 HttpContext.Current

你必须通过 Parallel.For 线程中需要的所有数据

  • 在循环或者循环之前分配的局部变量
  • Parallel.For<TLocal> 中使用的TLocal 实例。

在任何情况下,如 HttpContext.Current.... 之类的代码。

原作者:

代码是专有的,因此我只发布了相关部分:

从传递以下对象:

  • HttpContext.Current
  • HttpContext.Current.Request
  • HttpContext.Current.Request.Url

    因为 GetDataFor 给了这么多错误。

而且我的需求

  • 请求 url 可以通过将url传递给它来生成,因为它是构造函数
  • 以及头的请求值,实质上是 string

我只将 string 传递给 GetDataFor() 方法:


public void SomeMethod()


{


 string requestUrl = HttpContext.Current.Request.Url.ToString();


 string sCookie = string.Format("{0}", HttpContext.Current.Request.Headers["cookie"]);



 Parallel.For(0, 100, i =>


 {


 var data = GetDataFor(i,


 requestUrl: requestUrl,


 sCookie: sCookie);


 });


}



public data GetDataFor(int i, string requestUrl = null, string sCookie = null)


{


 Uri requestUri = null;


 if (HttpContext.Current!= null)


 {


 requestUri = HttpContext.Current.Request.Url;


 sCookie = string.Format("{0}", HttpContext.Current.Request.Headers["cookie"]);


 }


 else


 {


 requestUri = new Uri(requestUrl);


 }



//do something


 return data;


}



原作者:
...