3

Visual Studio 2010 で C# .Net4.0 を使用してこのプログラムを作成しています。目標は、スレッドとキューを使用してパフォーマンスを向上させることです。

処理する必要がある URL のリストがあります。

string[] urls = { url1, url2, url3, etc.} //up to 50 urls

各 URL を取り込んで処理する関数があります。

public void processUrl(string url) { 
    //some operation
}

もともと、各 URL を通過する for ループを作成しました。

for (i = 0; i < urls.length; i++)
    processUrl(urls[i]);

メソッドは機能しますが、URL を次々と通過していたため、プログラムは低速です。

したがって、スレッド化を使用して時間を短縮するという考えですが、そのアプローチ方法がよくわかりません。

同時に処理する 5 つのスレッドを作成したいとします。

プログラムを起動すると、最初の 5 つの URL の処理が開始されます。完了すると、プログラムは 6 番目の URL を処理します。別の URL が完了すると、プログラムは 7 番目の URL の処理を​​開始します。

問題は、URL の「キュー」を実際に作成し、キューを通過して処理できるようにする方法がわからないことです。

誰でもこれで私を助けることができますか?

-- 午後 1 時 42 分に編集 --

同時に5つのプロセスを実行していたときに、別の問題が発生しました。

このprocessUrl関数には、ログ ファイルへの書き込みが含まれます。また、複数のプロセスが同時にタイムアウトした場合、それらは同時に同じログ ファイルに書き込みを行っており、エラーがスローされていると思います。

私が受け取ったエラーメッセージは「別のプロセスで使用されているため、プロセスはファイル 'data.log'にアクセスできません」だったので、それが問題だと思います。

4

3 に答える 3

0

並列実行を使用する代わりに、タスクを達成するためにスレッドを作成したい場合は、次のようにします。

URL ごとに 1 つのスレッドが必要だとします。

string[] urls = {"url1", "url2", "url3"};

各 URL (または 5 つの URL ごと) に対して新しい Thread インスタンスを開始するだけです。

foreach (var thread in urls.Select(url => new Thread(() => DownloadUrl(url))))
    thread.Start();

URL をダウンロードする方法は次のとおりです。

private static void DownloadUrl(string url)
{
    Console.WriteLine(url);   
}
于 2013-07-05T16:24:09.907 に答える