[英]C# Multithreading Loop Datatable
我有一个datatable
有1000 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.