1

私はスレッドの専門家ではありませんが、関数を一度に N 回並行して実行し、必要に応じて複数のコアを使用できるようにしたいと考えていました。

私は現在、以下のコードを持っています:

tasks = new List<Task>();
for (int i = 0; i < _runThreads; i++)
{
    tasks.Add(Task.Factory.StartNew(() =>
    {
        GetRSS();
    }, stopAllTasks.Token));
}

GetRSS サンプル:

private void GetRSS()
{
    while (!queue.IsEmpty)
    {
        int total = 0;
        // dequeue, get url bla bla
        using (WebClient client = new WebClient())
        {
            //some code here get html content
        }
        // parse the rss bla bla
        // get the count of total items found 
        // update total variable with the total

        Interlocked.Add(ref counter, total);
    }
}

ご覧のとおり、GetRSS コードでは、counter取得したページごとの合計エントリ数を更新しています。タイマーが刻むと、カウンターの値がラベルに更新されるため、進行状況を確認できます。

このことから、タスクがすべて一度に機能していないことに気付きましたが、カウンターは X 量のみを更新するため、実際には 1 つずつ機能しています。これは、実行中の単一の機能に相当します。

そこから、上記のコードは実際にはタスクを並行して実行していないと思いますが、順番に実行しているようです。

  • そうですか?

  • もしそうなら、実際に並行して実行されるようにコードを変換するにはどうすればよいですか?

4

1 に答える 1

2

コードは確実に並行して実行する必要があります。ここで同様の質問をチェックしてください。

また、接続制限に直面する可能性があるため、順次実行されると考えることができます。構成を使用して、それをオーバーライドできます。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.net>
        <connectionManagement>
            <add address="*" maxconnection="<some reasonable number here>" />
        </connectionManagement>
    </system.net>
</configuration>
于 2012-06-21T21:45:48.370 に答える