Можно сделать синхронный старт через «барьер» — поток(ы) готовят запросы, ждут сигнала, по сигналу все одновременно отправляют. В C# это делается очень просто (пример с Manual Reset Event Slim + Task):
var start = new Manual Reset Event Slim(false);
var http = new HttpClient();
var tasks = Enumerable.Range(0, 15).Select(i => Task.Run(async () => {
// подготовка тела/заголовков
start.Wait(); // ждём общего сигнала
var resp = await http.PostAsync(url, content);
return await resp.Content.ReadAsStringAsync();
})).ToArray();
// всё готово — даём сигнал
start.Set();
await Task.WhenAll(tasks);
Альтернативы: CountdownEvent (ждёт пока все будут готовы), Barrier (для циклической синхронизации). Важно: абсолютной «мгновенности» ждать не стоит — сети и ОС вводят задержки. Учитывайте лимиты сервера, добавьте jitter/логирование и обработку ошибок/таймаутов.
Если вы в ZennoPoster — аналогично: подготовьте все «кубики» до точки ожидания и синхронизируйте через общий файл/DB/Redis или через внешнюю C# службу, которая выдаст сигнал.