经过多次尝试后发布此问题。执行normal for
is not an option因为我们需要在很短的时间内完成大量处理。
我在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.Current
,HttpContext.Current.Request
,HttpContext.Current.Request.Url
作为method parameters传递时:
HttpContext.Current无法序列化,因为它没有无参数构造函数
Passing HttpContextBase httpContext = null
as parameter throws:
要进行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无法序列化,因为它没有无参数构造函数
我做了所有这些以发送它reference和state,但无法理解为什么问题没有解决。
如何在HttpContext.Current
内使用Parallel.For
?我在这里做错了什么?
HttpContext.Current.Request.Url
和HttpContext.Current.Request.Headers["cookie"]
答案 0 :(得分:3)
HttpContext.Current
仅在请求处理线程中可用(非空)。 Parallel.For
创建多个线程,其中任何一个都无法访问HttpContext.Current
。
您必须通过
传递Parallel.For
个线程中的代码所需的所有数据
TLocal
Parallel.For<TLocal>
中使用的实例。
无论如何,HttpContext.Current....
等代码都已用完。
答案 1 :(得分:0)
代码是专有的,因此我只发布relevant parts:
由于传递了以下对象:
HttpContext.Current
HttpContext.Current.Request
HttpContext.Current.Request.Url
因为GetDataFor
的参数丢失了很多错误。
另外,我的需求只是
string
传递给它的构造函数来重新生成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;
}