1

httpwebrequest特定の範囲のページから数千のレコードを使用してWebサーバーにアクセスし、フェッチしたいと考えています。Webページへのヒットごとに15レコードがフェッチされ、Webサーバーにはほぼ8〜10000ページがあります。これは、サーバーへの合計120000ヒットを意味します。単一のプロセスで簡単に実行すると、タスクに非常に時間がかかる可能性があります。したがって、マルチスレッドが頭に浮かぶ当面の解決策です。

現在、私は検索目的でワーカークラスを作成しました。そのワーカークラスは、指定された範囲で検索するために5つのサブワーカー(スレッド)を生成します。しかし、スレッドの初心者の能力のために、同期してすべてを一緒に機能させるのに問題があるため、それを機能させることができません。.NETのデリゲート、アクション、イベントについては知っていますが、それらをスレッドで動作させると混乱します。これは私が使用しているコードです。

public void Start()
{
    this.totalRangePerThread = ((this.endRange - this.startRange) / this.subWorkerThreads.Length);
    for (int i = 0; i < this.subWorkerThreads.Length; ++i)
    {
        //theThreads[counter] = new Thread(new ThreadStart(MethodName));
        this.subWorkerThreads[i] = new Thread(() => searchItem(this.startRange, this.totalRangePerThread));
        //this.subWorkerThreads[i].Start();
        this.startRange = this.startRange + this.totalRangePerThread;
    }

    for (int threadIndex = 0; threadIndex < this.subWorkerThreads.Length; ++threadIndex)
        this.subWorkerThreads[threadIndex].Start();
}

searchItemメソッド:

public void searchItem(int start, int pagesToSearchPerThread)
{
    for (int count = 0; count < pagesToSearchPerThread; ++count)
    {
     //searching routine here
    }
}

スレッドの共有変数間に問題があります。スレッドセーフな手順にする方法を教えてもらえますか?

4

2 に答える 2

1

最初の答えは、これらのスレッドは変数を共有するためにそれほど多くの作業を必要としないということです(私があなたを正しく理解していると仮定します)。それらにはいくつかの共有入力変数(たとえば、ターゲットWebサーバー)がありますが、それらは変更されていないため、スレッドセーフです。計画では、取得したレコードを含むデータベースなどを構築します。5つのそれぞれに独自の入力アーカイブを埋めさせ、すべてのサブワーカースレッドが完了したら、それらを1つのスレッドにマージするだけで問題ありません。どういうわけか、データの保存に使用しているアーキテクチャがそれを高価にする場合...まあ、保存する予定の量と保存する予定の内容が適切になると、おそらくあなたは何を共有することができますかそれらは?

于 2013-03-22T18:57:03.433 に答える
1

あなたが直面している本当の問題は、Threadコンストラクターのlabmda式が外部変数(startRange)をキャプチャしていることです。これを修正する1つの方法は、次のように変数のコピーを作成することです。

for (int i = 0; i < this.subWorkerThreads.Length; ++i)
{
    var copy = startRange;
    this.subWorkerThreads[i] = new Thread(() => searchItem(copy, this.totalRangePerThread));
    this.startRange = this.startRange + this.totalRangePerThread;
}

スレッドの作成と開始の詳細については、Joe Albahariの優れた電子書籍を参照してください(キャプチャされた変数のセクションも少し下にあります)。クロージャについて知りたい場合は、この質問を参照してください。

于 2013-03-22T19:12:22.903 に答える