Здравствуйте, ·, Вы писали:
S>>По Task я вижу, что метод асинхронный и могу использовать либо параллельно, либо последовательно через await.
·>А с виртуальными тредами ты видишь любой метод и можешь использовать либо параллельно, либо последовательно без всякого await-шлака.
Ты не понял. Есть IO методы или методы получающие результат по событию (та же асинхронная очередь). Они не напрягают CPU поэтому видя такой метод я предпочту параллельное выполнение.
await ничем не хуже
Опять же
private static readonly AsyncLock _lock = new AsyncLock();
Task<Product> coreApi(long id) {
var d1 = readFromFile(id); // возвращает Task не дожидаемся результата
var d2 = queryDb(id, d1); // возвращает Task не дожидаемся результата
using (await _lock.LockAsync())
{
var d3 = await downloadFromRestApi(id, d2, d1); // внутри downloadFromRestApi дожидаемся выполнения d2 и d1
return new Product(d3, await d1);
}
}
И вот сравни такой подход c StructuredTaskScope
На самом деле Task были придуманы еще в 12 году. В Яве виртуальные потоки появились значительно позже, а StructuredTaskScope так вообще еще превью.
Виртуальные потоки однозначно хороши для синхронного кода. Но что касается асинхронного, то тут нет однозначности.
Я предпочитаю Task. Task async await показывают как я использую метод как задачу или результат задачи.
И предпочту рефакторинг кода.
Засим откланиваюсь.