在Parallel.For内部调用的方法中,HttpContext为null
尝试了很多后发布这个问题。 做正常不是一种选择,因为我们需要在很短的时间内完成大量的处理。
我有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; }
在正常循环中一切正常。 但是,当我在Parallel.For
调用它并传递HttpContext.Current
, HttpContext.Current.Request
, HttpContext.Current.Request.Url
作为方法参数时 :
HttpContext.Current无法序列化,因为它没有无参数构造函数
传递HttpContextBase httpContext = null
作为参数抛出 :
要进行XML可序列化,从ICollectioninheritance的类型必须在其inheritance层次结构的所有级别都具有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.Url
和HttpContext.Current.Request.Headers["cookie"]
HttpContext.Current
仅在请求处理线程内可用(非空)。 Parallel.For
创建多个线程,其中没有一个线程可以访问HttpContext.Current
。
您必须传递Parallel.For
所有代码数据。线程需要通过
无论如何,像HttpContext.Current....
这样的代码已经出来了。
代码是专有的,因此我只发布相关部分 :
传递以下对象后:
此外,我的需求只是
- 请求url ,可以通过将url作为
string
传递给它的构造函数来重新生成 - 和请求头的值本质上是一个
string
我只将string
传递给GetDataFor()
方法:
上述就是C#学习教程:在Parallel.For内部调用的方法中,HttpContext为null分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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; }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/950509.html