我正在尝试线程并且相对较新。
我想要做的只是在传入参数的另一个类上调用void。
for (int i = 0; i < 1; i++)
{
foreach (DataRow dtRow in urlTable.Rows)
{
Thread thread = new Thread(new ParameterizedThreadStart(MasterCrawlerClass.MasterCrawlBegin(dtRow)));
}
}
public static void MasterCrawlBegin(DataRow dtRow)
{
if (dtRow.ItemArray[0].ToString().Contains("$"))
{
linkGrabberwDates(dtRow.ItemArray[0].ToString(), "www");
}
else
{
NoDatesCarCrawler(dtRow.ItemArray[0].ToString(), "www");
}
}
另外,我的意图是有4个线程,而每个线程只传入1个数据行。我不认为我现在如何实现它。
谢谢!
答案 0 :(得分:1)
如果您希望此工作按照您尝试的方式工作,则必须使MasterCrawlBegin
方法以object
为参数,然后传入对方法本身:
Thread thread = new Thread(new ParameterizedThreadStart(MasterCrawlerClass.MasterCrawlBegin));
但是利用闭包和lambda函数更容易,而不是求助于ParameterizedThreadStart类。
Thread thread = new Thread(() => MasterCrawlerClass.MasterCrawlBegin(dtRow));
在阅读了对其他答案的评论之后,我想您可以从了解.NET 4的Task Parallel Library和PLINQ中受益。您可以以一种非常理想的方式并行化整个集合:
urlTable.Rows.Cast<DataRow>().AsParallel()
.ForAll(MasterCrawlerClass.MasterCrawlBegin);
这将让框架弄清楚它认为应该使用多少个线程。如果你想要更多的控制,有一些微调方法,比如确保使用恰好四个并发线程:
urlTable.Rows.Cast<DataRow>().AsParallel().WithDegreeOfParallelism(4)
.ForAll(MasterCrawlerClass.MasterCrawlBegin);
答案 1 :(得分:1)
为了轻松完成此任务,同样使用与数据行解析相关的内容,您只能访问全局变量并避免像参数一样传递它。如果解析意味着读取来自DataRow
的数据,那么您就安全了。如果你需要写入,最好实现一些锁定/同步机制,即使你完全确定现在一个线程始终访问它自己的行。
希望这有帮助。
答案 2 :(得分:1)
此类代码也应该有效:
for (int i = 0; i < 1; i++)
{
foreach (DataRow dtRow in urlTable.Rows)
{
Thread thread = new Thread(MasterCrawlerClass.MasterCrawlBegin);
thread.Start(dtRow);
}
}
public static void MasterCrawlBegin(object data)
{
var dtRow = (DataRow)data;
if (dtRow.ItemArray[0].ToString().Contains("$"))
{
linkGrabberwDates(dtRow.ItemArray[0].ToString(), "www");
}
else
{
NoDatesCarCrawler(dtRow.ItemArray[0].ToString(), "www");
}
}