C#方法名称使用ParameterizedThreadStart预期的错误

时间:2012-04-08 17:39:24

标签: c#

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

我想要做的只是在传入参数的另一个类上调用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个数据行。我不认为我现在如何实现它。

谢谢!

3 个答案:

答案 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 LibraryPLINQ中受益。您可以以一种非常理想的方式并行化整个集合:

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

    }