Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#方法名称预期错误,使用ParameterizedThreadStart_C# - Fatal编程技术网

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

C#方法名称预期错误,使用ParameterizedThreadStart,c#,C#,我正在尝试线程技术,而且对它比较陌生 我想做的只是在传入参数的不同类上调用void for (int i = 0; i < 1; i++) { foreach (DataRow dtRow in urlTable.Rows) { Thread thread = new Thread(new ParameterizedThreadStart(MasterCrawlerClass.MasterCr

我正在尝试线程技术,而且对它比较陌生

我想做的只是在传入参数的不同类上调用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");
        }

    }
for(int i=0;i<1;i++)
{
foreach(urlTable.Rows中的DataRow dtRow)
{
线程线程=新线程(新的参数化线程开始(MasterCrawlClass.MasterCrawlBegin(dtRow));
}
}
公共静态无效主爬网开始(DataRow dtRow)
{
if(dtRow.ItemArray[0].ToString()包含(“$”)
{
linkGrabberwDates(dtRow.ItemArray[0].ToString(),“www”);
}
其他的
{
NodeScarCrawler(dtRow.ItemArray[0].ToString(),“www”);
}
}
另外,我的目的是让4个线程运行,而这些线程中的每个线程只传递1个数据行。我不认为我现在是如何做到这一点的


谢谢

如果您希望以您尝试的方式完成此工作,则必须使您的
MasterScrawBegin
方法将
对象作为其参数,然后传入对该方法本身的引用:

Thread thread = new Thread(new ParameterizedThreadStart(MasterCrawlerClass.MasterCrawlBegin));
但是更容易利用闭包和lambda函数,而不是求助于ParameterizedThreadStart类

Thread thread = new Thread(() => MasterCrawlerClass.MasterCrawlBegin(dtRow));
更新 在阅读了您对另一个答案的评论后,我认为您可能会从学习.NET4和中受益。您可以用如下非常理想的方式并行化整个集合:

urlTable.Rows.Cast<DataRow>().AsParallel()
    .ForAll(MasterCrawlerClass.MasterCrawlBegin);
urlTable.Rows.Cast()
.ForAll(MasterCrawlerClass.mastercrawlerbegin);
这将让框架计算出它认为应该使用多少线程。如果您想要更多的控制,可以通过以下方式进行微调,例如确保只使用四个并发线程:

urlTable.Rows.Cast<DataRow>().AsParallel().WithDegreeOfParallelism(4)
    .ForAll(MasterCrawlerClass.MasterCrawlBegin);
urlTable.Rows.Cast().aspallel().WithDegreeOfParallelism(4)
.ForAll(MasterCrawlerClass.mastercrawlerbegin);

如果您希望这项工作按照您尝试的方式进行,则必须使您的
MasterScrawBegin
方法将
对象作为其参数,然后传入对该方法本身的引用:

Thread thread = new Thread(new ParameterizedThreadStart(MasterCrawlerClass.MasterCrawlBegin));
但是更容易利用闭包和lambda函数,而不是求助于ParameterizedThreadStart类

Thread thread = new Thread(() => MasterCrawlerClass.MasterCrawlBegin(dtRow));
更新 在阅读了您对另一个答案的评论后,我认为您可能会从学习.NET4和中受益。您可以用如下非常理想的方式并行化整个集合:

urlTable.Rows.Cast<DataRow>().AsParallel()
    .ForAll(MasterCrawlerClass.MasterCrawlBegin);
urlTable.Rows.Cast()
.ForAll(MasterCrawlerClass.mastercrawlerbegin);
这将让框架计算出它认为应该使用多少线程。如果您想要更多的控制,可以通过以下方式进行微调,例如确保只使用四个并发线程:

urlTable.Rows.Cast<DataRow>().AsParallel().WithDegreeOfParallelism(4)
    .ForAll(MasterCrawlerClass.MasterCrawlBegin);
urlTable.Rows.Cast().aspallel().WithDegreeOfParallelism(4)
.ForAll(MasterCrawlerClass.mastercrawlerbegin);

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


希望这能有所帮助。

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


希望这能有所帮助。

这样的代码也应该可以工作:

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

    }
for(int i=0;i<1;i++)
{
foreach(urlTable.Rows中的DataRow dtRow)
{
线程线程=新线程(MasterCrawlerClass.mastercrawlerbegin);
thread.Start(dtRow);
}
}
公共静态void主数据(对象数据)
{
var dtRow=(DataRow)数据;
if(dtRow.ItemArray[0].ToString()包含(“$”)
{
linkGrabberwDates(dtRow.ItemArray[0].ToString(),“www”);
}
其他的
{
NodeScarCrawler(dtRow.ItemArray[0].ToString(),“www”);
}
}

这样的代码也应该起作用:

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

    }
for(int i=0;i<1;i++)
{
foreach(urlTable.Rows中的DataRow dtRow)
{
线程线程=新线程(MasterCrawlerClass.mastercrawlerbegin);
thread.Start(dtRow);
}
}
公共静态void主数据(对象数据)
{
var dtRow=(DataRow)数据;
if(dtRow.ItemArray[0].ToString()包含(“$”)
{
linkGrabberwDates(dtRow.ItemArray[0].ToString(),“www”);
}
其他的
{
NodeScarCrawler(dtRow.ItemArray[0].ToString(),“www”);
}
}

您是指var dtRow=(数据行)数据;?当然可以。在发布答案后一分钟内更改了它。让我问你,如何运行4个线程来遍历所有数据行?也就是说,如果我有1000个数据行,并且一次只需要4个线程拥有4行,那么如何实现这一点呢?您必须使用4个线程之间的同步来一次控制读取项目的数量。例如,ManualResetEvent类。您是指var dtRow=(DataRow)数据;?当然可以。在发布答案后一分钟内更改了它。让我问你,如何运行4个线程来遍历所有数据行?也就是说,如果我有1000个数据行,并且一次只需要4个线程拥有4行,那么如何实现这一点呢?您必须使用4个线程之间的同步来一次控制读取项目的数量。例如,ManualResetEvent类。然后用thread.Sta启动它