私はスレッドの専門家ではありませんが、関数を一度に 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 つずつ機能しています。これは、実行中の単一の機能に相当します。
そこから、上記のコードは実際にはタスクを並行して実行していないと思いますが、順番に実行しているようです。
そうですか?
もしそうなら、実際に並行して実行されるようにコードを変換するにはどうすればよいですか?