А я правильно понимаю что явный JOIN через LINQ - например
var query = from entity in dbContext.Entities
join relatedData in dbContext.RelatedData on entity.RelatedDataId equals relatedData.Id
select new { Entity = entity, RelatedData = relatedData };
var result = query.FirstOrDefault();
по сути эквивалентен Include?
var entityWithRelatedData = dbContext.Entities
.Include(e => e.RelatedData)
.FirstOrDefault();
Василий Банников, Можно ли сказать что.
На практике в C# во всех асинхронных методах используется многопоточность на основе пула потоков, хотя концептуально это не обязательно, просто реализация такая.
Преимущество же над классической многопоточностью в том, что мы не беспокоимся о работе с потоками и просто кидаем задачку на выполнение, если она не выполнена то оператор await передает управление вызывающему потоку и ожидает выполнение операции своего операнда (по сути, эта операция может выполнятся в том же потоке, но на практике чаще всего она работает через таску которая запускается в потоках из пула потоков) когда асинхронная задача завершена - await пытается продолжить работать с методом в вызывающем потоке, если это невозможно, то используется тот же поток из пула потоков. Но такая модель подходит лучше всего для IO Bound задач(запросы к БД, чтения из файла, ввод-вывод итд...) а для некоторых задач которые вызывают CPU Bound - лучше использовать многопоточность?
Прошу прощения, я неверно подобрал некоторые термины.
Под классической многопоточностью я подразумевал прямое создание тредов и передачи им в параметры методов.
В примерах я сделал(как мне кажется, возможно я ошибаюсь) то же самое, в обоих случаях используются 2 потока(только в случае с таском поток берется из тред-пула) и я не совсем понимаю где всё-таки блокируется вызывающий поток в случае с тредами. Прошу прощения за очевидно глупые вопросы, но очень бы хотелось услышать объяснение.
То бишь, в данном случае с анонимными методами и инициализацией делегата нет ничего общего?
Просто такой же синтаксис?
И работает это только с методами которые содержат одну инструкцию?
Антон Неверов, Спасибо, понял, а почему в приведенном случае, если убарть catch в Main не выполнится ни один блок finally, разве CLR не должен искать его спускаясь по стеку параллельно выполняя блоки finally?
var query = from entity in dbContext.Entities
join relatedData in dbContext.RelatedData on entity.RelatedDataId equals relatedData.Id
select new { Entity = entity, RelatedData = relatedData };
var result = query.FirstOrDefault();
по сути эквивалентен Include?
var entityWithRelatedData = dbContext.Entities
.Include(e => e.RelatedData)
.FirstOrDefault();