0

我正在尝试线程并且相对较新。

我想要做的只是在传递参数的不同类上调用一个 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 个数据行。我不认为我现在拥有它是如何做到这一点的。

谢谢!

4

3 回答 3

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");
        }

    }
于 2012-04-08T17:47:37.757 回答
1

如果您希望这项工作以您尝试的方式工作,您必须让您的MasterCrawlBegin方法将 anobject作为其参数,然后传入对该方法本身的引用:

Thread thread = new Thread(new ParameterizedThreadStart(MasterCrawlerClass.MasterCrawlBegin));

但是利用闭包和 lambda 函数比使用 ParameterizedThreadStart 类更容易。

Thread thread = new Thread(() => MasterCrawlerClass.MasterCrawlBegin(dtRow));

更新

在阅读了您对另一个答案的评论后,我认为您可能会从了解 .NET 4 的Task Parallel LibraryPLINQ中受益。您可以像这样以非常优化的方式并行化整个集合:

urlTable.Rows.Cast<DataRow>().AsParallel()
    .ForAll(MasterCrawlerClass.MasterCrawlBegin);

这将让框架计算出它认为应该使用多少线程。如果你想要更多的控制,有一些微调的方法,比如确保使用四个并发线程:

urlTable.Rows.Cast<DataRow>().AsParallel().WithDegreeOfParallelism(4)
    .ForAll(MasterCrawlerClass.MasterCrawlBegin);
于 2012-04-08T17:42:39.030 回答
1

为了轻松实现这一点,还可以使用与数据行解析相关的内容,您可以只访问一个全局变量并避免像参数一样传递它。如果通过解析您的意思是从读取数据DataRow,那么您是安全的。如果您需要写入,最好实现一些锁定/同步机制,即使您现在完全确定一个线程总是访问自己的行。

希望这可以帮助。

于 2012-04-08T17:44:29.717 回答