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

この作業を目的の方法で機能させたい場合は、MasterCrawlBeginメソッドにobjectパラメーターとしてを取得させてから、メソッド自体への参照を渡す必要があります。

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

ただし、ParameterizedThreadStartクラスに頼るよりも、クロージャとラムダ関数を利用する方が簡単です。

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

アップデート

別の回答についてのコメントを読んだ後、.NET4のタスク並列ライブラリPLINQについて学ぶことでメリットが得られると思います。次のように、コレクション全体を非常に最適な方法で並列化できます。

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

これにより、フレームワークは、使用する必要があると考えるスレッドの数を把握できます。より詳細な制御が必要な場合は、正確に4つの同時スレッドが使用されるようにするなど、微調整する方法があります。

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

これを簡単に実現するために、データ行の解析に関連するものを使用して、グローバル変数のみにアクセスし、パラメーターのように渡すことを回避できます。解析することで、からデータを読み取ることを意味する場合はDataRow、安全です。書き込みが必要な場合は、1つのスレッドが常に独自の行にアクセスすることが完全にわかっている場合でも、ロック/同期メカニズムを実装することをお勧めします。

お役に立てれば。

于 2012-04-08T17:44:29.717 に答える
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 に答える