繁体   English   中英

C# 多线程循环数据表

[英]C# Multithreading Loop Datatable

我有一个datatable1000 records 每一行都有一个link.I将循环的一列datatable使用中的链接网站,并获取记录datatable 代码运行良好,但检索记录花费了太多时间。 所以,我需要它通过在多线程和获取记录和全部记录添加到一个单一的datatable 我使用C# , Visual studio 2015

我们如何使用threading C# ,任何帮助表示赞赏。

现有代码如下。

 for (int i = 0; i < dt.Rows.Count; i++)
            {
                String years = String.Empty;


                dt.Rows[i]["Details"] = GetWebText(dt.Rows[i]["link"].ToString());

            }



    private String GetWebText(String url)
        {
            var html = new HtmlAgilityPack.HtmlDocument();
          string text= html.LoadHtml(new WebClient().DownloadString(url));

return text;
        }

您将在这里遇到数据表写入操作的线程安全问题。 所以你需要确保你执行的操作分开得很好。

好消息是您实际上正在执行三个不同的步骤,您可以轻松地将它们分开并并行化缓慢的部分,同时保持线程安全。

这是您的代码正在执行的操作:

var url = dt.Rows[i]["link"].ToString();
var webText = GetWebText(url);
dt.Rows[i]["Details"] = webText;

让我们在这三个步骤中处理数据,但只并行化GetWebText部分。

这是如何:

var data =
    dt
        .AsEnumerable()
        .Select(r => new { Row = r, Url = r["link"].ToString() })
        .AsParallel()
        // This `Select` is the only part run in parallel
        .Select(x => new { x.Row, WebText = GetWebText(x.Url) })
        .ToArray();

foreach (var datum in data)
{
    datum.Row["Details"] = datum.WebText;
}

阻塞 Collections 可以解决这个问题:

Blocking<string> links= new BlockingCollection<string>();\\ using System.Collections.Concurrent;
Blocking<string> results= new BlockingCollection<string>();

public static void main()
{
//get your datatable
       for (int i = 0; i < dt.Rows.Count; i++)
        {
        ThreadStart t = new ThreadStart(threads);
      Thread th = new Thread(t);
        th.Start();
        }
       for (int i = 0; i < dt.Rows.Count; i++)
        {
        links.add(dt.Rows[i]["link"].ToString());
        }
        for (int i = 0; i < dt.Rows.Count; i++)
        {
           dt.Rows[i]["Details"] = results.Take();
          }
}
public void threads()
{
while(true)
 {
  string url= Links.take();//block if links is empty
  var html = new HtmlAgilityPack.HtmlDocument();
  string text= html.LoadHtml(new WebClient().DownloadString(url));
  results.add(text);//add result to the other queue
 }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM