« first day (978 days earlier)      last day (2053 days later) » 

7:49 AM
@Bretbas поздравляю, выглядит потрясающе
 
 
2 hours later…
9:45 AM
@vitidev Что-то мне не верится, что поле под названием AllowGlobal реально независимо от остальных данных. Пахнет lock'ом.
 
10:18 AM
@VladD сомневаюсь что вы все классы в обычном async/await стиле программирования делаете под локами. )
таски обладают барьерами памяти. но эти барьеры в начале и в конце таски. Значит при присвоении свойства в середине выполнения таски это свойство обладает побочными эффектами неволатильности. Однако никто чет не мудрит вот такую защиту
современное прилжоение состоит из async/await на 90%
 
10:52 AM
@vitidev Нет, но они у меня по сути STA
То есть внешний вызов маршаллируется в рабочий поток
Потому что async/await синхронизирует доступ к локальным переменным, но не к полям
Для этого у меня есть класс Engine, который является по сути однопоточным SynchronizationContext'ом
И каждый объект живёт в том или ином Engine.
То есть, практически каждый публичный метод начинается с await engine.RedirectTo();
А если кто-то говорит, что для производительности нужно MTA и локи, я посылаю его так далеко, как только возможно (то есть, в профайлер). Ни один ещё не возвращался.
С STA-программированием необходимость в локах отпадает
 
@VladD а если кто то займет STA поток
хотя он може быть не из пула да. но тогда нужны ручные барьеры
 
@vitidev А я не провожу в Engine-потоке блокирующие операции
 
@VladD но все равно этот поток может вовлекаться в другие операции чем вызывать задержки доступа посильнее лока
 
А если нужно процессор-интенсивное что-то, это выносится на пул через Task.Run. Или вообще в отдельный поток
@vitidev Не имеет права.
Ну разве что модель с какой-нибудь числомолотилкой. Ну так она живёт в отдельном потоке и ни на что не претендует.
 
ну вот асинк/авайт по всей программе перемалывается в потоках пула. а значит в любой момент нужный поток может кто то забрать. пусть даже ненадолго. а Parallel.Foreach так вообще сильно. А значит await engine.RedirectTo(); будет ждать пока отдадут.

у вас await engine.RedirectTo(); в классах моделей тоже что ли есть?
 
11:04 AM
Например, если мне нужно обработать очередь из миллиона объектов, то это модельная задача, и она живёт в своём отдельном потоке. И общается только с VM
@vitidev Ну, Engine-потоки не в пуле
И в них никто не имеет права блокироваться, точно так же, как и в UI-потоке
Вообще, никакой STA-поток (а UI — тоже STA) блокировать нельзя
 
ну у вас же не по енгине на класс. значит кучкуются. впрочем можно разумно кучковать

однако использовать везде СНАРУЖИ engine.RedirectTo() для чтения одного поля это жесть
 
@vitidev Иногда. Иногда имеет смысл запустить модель в STA. Но обычно модель работает не так, она просто выставляет интерфейс управления для VM, и сообщает о результатах через ивенты
 
я говорю про обычные классы. типа тех что в базе данных хранят
 
@vitidev Кучкуются, да, и имеет смысл тесно связанные компоненты кучковать, чтобы уменьшить количество редиректов.
@vitidev А у меня поэтому нет низкоуровневой операции типа «прочитать поле»
Есть операция «дать полный статус», например
Операции должны быть крупноблочными, это ж ООП
@vitidev Нет, это не снаружи, это внутри
У меня не торчит наружу поле, а торчит async-метод.
то есть невозможно клиенту прочитать значение не в том потоке
публичный метод заредиректит его вызов куда следует
Я стараюсь, чтобы мои классы были не контейнерами полей, а живыми объектами. Чтение свойства не имеет смысла, т. к. значение устаревает в момент чтения.
Клиент хочет наблюдать за свойством — выставляется IObservable.
Ну или по рабоче-крестьянски event
@vitidev А что с ними не так?
База у нас STA тоже, кстати
 
11:20 AM
@VladD ну их может например EF генерить
 
@vitidev Ну, если он генерирует классы, которые не подходят в чистом виде, то придётся написать тонкую прослойку, куда ж без этого
 
11:42 AM
@VladD дык вот только пишутся программы не какие то многопоточные по самое не могу. а просто async/await. и вводя async/await для облегчения написания кода сильно осложняется остальной код
 
12:13 PM
@vitidev Ну да, нужны квалифицированные программисты
как решить эти проблему, я не знаю
 
12:34 PM
@vitidev Ну и я не вижу особой проблемы. Если я нахожусь в async-контексте, то мне легко писать асинхронный код. Если я не нахожусь в async-контексте, то я какая-нибудь модель, и мне по идее всё равно.
 
 
7 hours later…
7:37 PM
@VladD значит у вас 100 оберток для взимодействия с обычными классами из async-контекста чтобы не забыть попасть в контекст Engine
 
8:22 PM
@vitidev Наоборот, ни одного!
У меня Engine, к которой принадлежит класс, вовсе не видна снаружи (как это и должно быть)
 

« first day (978 days earlier)      last day (2053 days later) »