在Parallel.For

时间:2016-02-18 14:06:42

标签: c# asynchronous parallel-processing null httpcontext

经过多次尝试后发布此问题。执行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.CurrentHttpContext.Current.RequestHttpContext.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无法序列化,因为它没有无参数构造函数

我做了所有这些以发送它referencestate,但无法理解为什么问题没有解决。

如何在HttpContext.Current内使用Parallel.For?我在这里做错了什么?

不过,所需的东西是:

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

2 个答案:

答案 0 :(得分:3)

HttpContext.Current仅在请求处理线程中可用(非空)。 Parallel.For创建多个线程,其中任何一个都无法访问HttpContext.Current

您必须通过

传递Parallel.For个线程中的代码所需的所有数据
  • 在循环之前分配的局部变量或
  • {li> TLocal Parallel.For<TLocal>中使用的实例。

无论如何,HttpContext.Current....等代码都已用完。

答案 1 :(得分:0)

代码是专有的,因此我只发布relevant parts

由于传递了以下对象:

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

    因为GetDataFor的参数丢失了很多错误。

另外,我的需求只是

  1. 请求url ,可以通过将url 作为string传递给它的构造函数来重新生成
  2. 和请求标头的值,基本上是string
  3. 我只将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;
    }