一度に 3 つのアイテムを処理する必要がある関数があり、合計所要時間が x 秒未満の場合、スレッドは残りの秒数スリープしてから先に進む必要があります。
だから私は次のことをやっています:
private void ProcessItems()
{
for (int i = 0, n = items.Count; i < n; i++)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
batch.Add(items[i]);
if (batch.Count == 3 || i >= items.Count - 3)
{
List<Task> tasks = new List<Task>(3);
foreach (Item item in batch)
tasks.Add(Task.Factory.StartNew(() => ProcessItem(item)));
Task.WaitAll(tasks.ToArray());
batch.Clear();
}
stopwatch.Stop();
int elapsed = (int)stopwatch.ElapsedMilliseconds;
int delay = (3000) - elapsed;
if (delay > 0)
Thread.Sleep(delay);
}
}
ProcessItem 関数は、webrequest を作成し、応答 (コールバック) を処理します。時間のかかる機能です。
ただし、タスクを正しく理解していれば、スレッドは複数のタスクを持つことができます。したがって、スレッドをスリープ状態にすると、他のタスクが影響を受ける可能性があります。
上記を達成するためのより効率的な方法はありますか? Parallel.Foreach 内でタスクを使用できますか?