使用Parallel.ForEach执行多个帖子

时间:2016-03-23 18:07:20

标签: c# asp.net parallel.foreach

这是我的语法,但我的行Parallel.ForEach()

上有编译错误
  

System.Data.DataRow是一种类型,但用作变量

我确信这很简单,我只是在俯视。以下是我的完整语法,如果有人可以帮助我找到我错过的内容,我将非常感激!

private void TryParallel()
{
  Dictionary<string, string> dic = new Dictionary<string, string>();
  string strEndpointURL = string.Format("http://sitetosenddatato.com/post");
  SqlDataReader reader;
  string strPostData = "";
  string strMessage = "";
  DataSet grds = new DataSet();
  grds = GetSQLResults();
  if (grds.Tables[0].Rows.Count >= 1)
  {
    Parallel.ForEach(DataRow, grds.Tables[0].Rows =>
    {
        dic.Add("userID", reader.GetValue(0).ToString());
        dic.Add("name", reader.GetValue(1).ToString());
        dic.Add("address", reader.GetValue(2).ToString());
        dic.Add("city", reader.GetValue(3).ToString());
        dic.Add("state", reader.GetValue(4).ToString());
        dic.Add("zip", reader.GetValue(5).ToString());
        dic.Add("Phone", reader.GetValue(6).ToString());
    });
  }
  System.Web.Script.Serialization.JavaScriptSerializer json = new System.Web.Script.Serialization.JavaScriptSerializer();
  foreach (var d in dic) { strPostData += d.Key + "=" + Server.UrlEncode(d.Value) + "&"; }
  strPostData += "hs_context=";
S  ystem.Net.HttpWebRequest r = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(strEndpointURL);
  r.Method = "POST";
  r.Accept = "application/json";
  r.ContentType = "application/x-www-form-urlencoded";
  r.ContentLength = strPostData.Length;
  r.KeepAlive = false;
  using (System.IO.StreamWriter sw = new System.IO.StreamWriter(r.GetRequestStream()))
  {
    try { sw.Write(strPostData); }
    catch (Exception ex) { strMessage = ex.Message; }
  }
  var response = r.GetResponse();
  Stream receiveStream = response.GetResponseStream();
  StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
  var result = readStream.ReadToEnd();
  var xml = System.Xml.Linq.XElement.Parse(result);
  if (xml.Elements("success").FirstOrDefault().Value == "1") { strMessage = "Success"; }
  else
  {
    var errors = xml.Elements("errors");
    foreach (var error in errors.Elements("error")) { strMessage = error.Value; }
  }
}

修改 按照@Glen Thomas下面列出的示例 - 我将代码改为

if (grds.Tables[0].Rows.Count == 1)
{
  Parallel.ForEach(rows, row =>
  {
    dic.Add("userID", reader.GetValue(0).ToString());
    //More Here
  }
}

出现编译错误:

  

使用未分配的本地变量&#39; reader&#39;

但我在方法的顶部声明了reader

2 个答案:

答案 0 :(得分:5)

您正在指定类型名称作为第一个参数。这应该是您正在迭代的集合。第二个参数是要执行的函数,其中包含集合中每个元素的参数。

Parallel.ForEach的正确用法是这样的:

var rows = new DataRow[0]

Parallel.ForEach(rows, row =>
{
    // Do something with row here
});

代码:

Parallel.ForEach(grds.Tables[0].Rows.OfType<DataRow>(), row =>
{
    dic.Add("userID", reader.GetValue(0).ToString());
    dic.Add("name", reader.GetValue(1).ToString());
    dic.Add("address", reader.GetValue(2).ToString());
    dic.Add("city", reader.GetValue(3).ToString());
    dic.Add("state", reader.GetValue(4).ToString());
    dic.Add("zip", reader.GetValue(5).ToString());
    dic.Add("Phone", reader.GetValue(6).ToString());
});

答案 1 :(得分:1)

我相信你想这样做:

    Parallel.ForEach(grds.Tables[0].Rows.OfType<DataRow>(), (row) =>
    {
        dic.Add("userID", reader.GetValue(0).ToString());
        dic.Add("name", reader.GetValue(1).ToString());
        dic.Add("address", reader.GetValue(2).ToString());
        dic.Add("city", reader.GetValue(3).ToString());
        dic.Add("state", reader.GetValue(4).ToString());
        dic.Add("zip", reader.GetValue(5).ToString());
        dic.Add("Phone", reader.GetValue(6).ToString());

        //though realistically you should be doing something with your specific row
    });

答案在您收到的错误消息中 - DataRow未定义为您提供的代码中的对象

但是,这实际上甚至没有解决您认为并行执行多个HTTP帖子的实际问题 - 因此您需要将您的帖子逻辑放在Parallel.ForEach()的匿名函数中