Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, vdimas, Вы писали:
V>>Да нет там косяков. Есть твоё неумение правильно готовить дотнет. Ты не знаешь, как он устроен и работает.
I>Ога, и InvalidOperation это тоже мой косяк ?
Естественно, твой. В оригинальном примере тот код заведомо запускается из потока GUI.
I>Смотри :
I>General execution context: I>8994 collisions! I>General execution context 19 I>GUI loop execution context: I>9530 collisions! I>GUI loop execution context 4
Сам факт подобного объяснения такому дотнетному гуру должен был сделать тебе стыдно.
V>>Это у тебя ошибки. У меня всё ОК. Попробуй еще раз, только внимательно.
I>Ты хотя бы InvalidOperation сначала пофикси,
Зачем его фиксить? У меня никаких InvalidOperation...
V>>Вместо того, чтобы подозревать, что у тебя "что-то пошло не так", ты решил подозревать окружающих. Ай, молодца! I>Расскажи лучше, как в твоем коде _resource при "отсутствии" коллизий считается неверно ?
Оно считается верно. У нас же там честные задержки на обоих диспетчерах. Другое дело, что на одном диспетчере код получился с гонками, а на другом — нет.
I>Для истории, пофикшеный код, твои косяки помечены каментом // Буллшыт
Для истории тебе опять двойка. Вот тут коммент не нужен:
В общем, ты ниасилил... Еще немного подобного упрямства с твоей стороны и мне придется слать тебе тесты исключительно в бинарниках. )))
А там уже будешь разбирать их рефлектором или еще каким декомпиллером.
Здравствуйте, Ikemefula, Вы писали:
V>>Я тебе сначала пытался словами объяснить происходящее — ты не понял. Я тебе уже дал код — ты не смог его даже запустить правильно.
I>А что там запускать ? Скомпилил и запустил, получил InvalidOperation, полез смотреть и нашел еще два косяка, как то так
Скомпилить можно по-разному.
I>Тебе что, видео записать ?
Если я увидел слово "вывод в консоль", то всё с тобой сразу понятно и без видео. Ладно бы еще новичок так лажанулся...
V>>1. Ты сравнивал один и тот же диспетчер сам с собой, не сумев активизировать второй. I>Я просто запустил твой код
Ну вот ты запустил, увидел InvalidOperation, ниче нигде не мелькнуло, а как же я его запускал без этой ошибки?
Ну клиника же... Не ожидал, прямо скажем...
Ну, ОК, в другой раз я буду высылать тебе настроенный файл проекта, если сам не справляешься.
===========================
Я уверен, ты давно уже понял, почему не смог запустить второй диспетчер, мог бы за 1 мин исправить и запустить... Это, типа, "а баба Яга против"? )))
Здравствуйте, vdimas, Вы писали:
I>>Ога, и InvalidOperation это тоже мой косяк ?
V>Естественно, твой. В оригинальном примере тот код заведомо запускается из потока GUI.
Чушь. Это возможно в твоем конкретном дотнете так, но гарантии этого нет.
I>>Смотри :
I>>General execution context: I>>8994 collisions! I>>General execution context 19 I>>GUI loop execution context: I>>9530 collisions! I>>GUI loop execution context 4
V>Вот тут я популярно объяснил, почему у тебя не получилось: http://www.rsdn.ru/forum/flame.comp/5339567.1
Это чушь. Правильный результат _resource будет 10000 , вот его и надо было обеспечить.
V>Сам факт подобного объяснения такому дотнетному гуру должен был сделать тебе стыдно.
Ты плохо понимаешь вопрос — от тебя требовалось пофиксить асинхронную часть, что бы выдать результат _resource == 10000
Но если у тебя на 10 строк 3 косяка, то это нереально
I>>Ты хотя бы InvalidOperation сначала пофикси,
V>Зачем его фиксить? У меня никаких InvalidOperation...
Тестировщикам ты так тоже говоришь ?
I>>Расскажи лучше, как в твоем коде _resource при "отсутствии" коллизий считается неверно ?
V>Оно считается верно. У нас же там честные задержки на обоих диспетчерах. Другое дело, что на одном диспетчере код получился с гонками, а на другом — нет.
Нет. Верный результат — 10000. Вот его и надо обеспечить. Покажи минимальный код который сохранит асинхронщину и даст этот результат.
V>Для истории тебе опять двойка. Вот тут коммент не нужен: V>
Здравствуйте, vdimas, Вы писали:
I>>А что там запускать ? Скомпилил и запустил, получил InvalidOperation, полез смотреть и нашел еще два косяка, как то так
V>Скомпилить можно по-разному.
Ну да, надо было компили твоим собственным компилером шарпа
I>>Тебе что, видео записать ?
V>Если я увидел слово "вывод в консоль", то всё с тобой сразу понятно и без видео. Ладно бы еще новичок так лажанулся...
И давно у тебя трейсы стали признаком консольного приложения ?
V>Ну вот ты запустил, увидел InvalidOperation, ниче нигде не мелькнуло, а как же я его запускал без этой ошибки?
Наверное никак ?
V>Ну клиника же... Не ожидал, прямо скажем...
Здравствуйте, Ikemefula, Вы писали:
V>>Ну вот ты запустил, увидел InvalidOperation, ниче нигде не мелькнуло, а как же я его запускал без этой ошибки? I>Наверное никак ?
Да по-всякому...
V>>Ну клиника же... Не ожидал, прямо скажем...
I>Протри глаза перед тем как смотреть картинку
Попробуй запустить по Ctrl+F5.
Щас чуть некогда, чуть позже доработаю пример, вставлю сбор статистики асинхронных потоков и вышлю уже бинарники. Уже самому интересно. У меня на 2-х машинах в WinForms в асинхронщину гарантированно заходит только один физический поток... Хотя он обслуживает несколько логических — асинхронных.
Сейчас убери тот _form.Close() и вообще переменную _form, попробуй вот этот вариант:
[STAThread]
static void Main(string[] args)
{
var task = Experiment("General execution context");
task.Start();
task.Wait();
var form = new Form();
form.Load += (o, a) => {
var task2 = Experiment("GUI loop execution context");
task2.Start();
while (!task2.IsCompleted) Application.DoEvents();
form.Close();
};
Application.Run(form);
}
Здравствуйте, vdimas, Вы писали:
V>Щас чуть некогда, чуть позже доработаю пример, вставлю сбор статистики асинхронных потоков и вышлю уже бинарники. Уже самому интересно. У меня на 2-х машинах в WinForms в асинхронщину гарантированно заходит только один физический поток... Хотя он обслуживает несколько логических — асинхронных.
Ты лучше покажи как забороть "коллизии" когда виндовый поток ровно один и пускает кучу асинхронных цепочек, т.е. что бы асинхронный код выдавал то же значение _resource что и синхронный аналог.
Вот это интересно, а твои виляния со стороны в сторону никому не интересны.
Здравствуйте, Ikemefula, Вы писали:
I>Это чушь. Правильный результат _resource будет 10000 , вот его и надо было обеспечить.
Это я даже обсуждать не намерен. Тебе дотнетная "линейная" асинхронщина дана как противопоставление событийному ООП-программированию. Кароч, тебе не надо хранить данные м/у вызовами "где-то", например, в полях класса, храни их в локальных переменных.
И да. Читая твой код мне ни разу в голову не пришло, что 10000 будет правильный ответ. Я ХЗ что надо вообразить о своей программе, чтобы дать такое предположение.
Кароч, закругляемся. Бинарник вышлю, мне уже самому интересно. Гонки ты путаешь с самой многопоточностью, поэтому обсуждать _resource бесполезно.
V>>Сам факт подобного объяснения такому дотнетному гуру должен был сделать тебе стыдно.
I>Ты плохо понимаешь вопрос — от тебя требовалось пофиксить асинхронную часть, что бы выдать результат _resource == 10000
Это ты формулируешь задачи. Как всегда — ближе к развязке. Для твоих целей объяви её локальной переменной. Для моих целей там никакой демонстрации гонок. В высланном примере я лишь показал разницу м/у вытесняющей и кооперативной многозадачностью. Больше ничего из твоего примера было не выжать. Для чего-то еще надо собрать статистику по потокам.
I>Но если у тебя на 10 строк 3 косяка, то это нереально
Косяк там, если умудриться запустить левый диспетчер.
I>Смотри в конец строки: I>
Здравствуйте, vdimas, Вы писали:
V>Это я даже обсуждать не намерен. Тебе дотнетная "линейная" асинхронщина дана как противопоставление событийному ООП-программированию. Кароч, тебе не надо хранить данные м/у вызовами "где-то", например, в полях класса, храни их в локальных переменных.
Шо, и базу со всеми таблицами и файл со всем контентом — все это в локальную переменную ? А ты, непростой !
V>И да. Читая твой код мне ни разу в голову не пришло, что 10000 будет правильный ответ. Я ХЗ что надо вообразить о своей программе, чтобы дать такое предположение.
Это про твои умения чтения кода, задача то избитая донельзя.
I>>Ты плохо понимаешь вопрос — от тебя требовалось пофиксить асинхронную часть, что бы выдать результат _resource == 10000
V>Это ты формулируешь задачи. Как всегда — ближе к развязке. Для твоих целей объяви её локальной переменной.
И всю базу данных поместить в эту локальную переменную ?
V>Ctrl+Insert при открытом MessageBox, Shift+Insert в форум.
Тебя это уже не спасёт — ты по наличию Trace "задетектил" консольное приложение
V>>Щас чуть некогда, чуть позже доработаю пример, вставлю сбор статистики асинхронных потоков и вышлю уже бинарники. Уже самому интересно. У меня на 2-х машинах в WinForms в асинхронщину гарантированно заходит только один физический поток... Хотя он обслуживает несколько логических — асинхронных.
I>Ты лучше покажи как забороть "коллизии" когда виндовый поток ровно один и пускает кучу асинхронных цепочек,
Дык, он и ДОЛЖЕН так делать. Своими случайными задержками ты затем меняешь асинхронные нити местами. Тут тоже всё ОК, я ХЗ что тебе не так.
I>т.е. что бы асинхронный код выдавал то же значение _resource что и синхронный аналог.
Ответ — каждый асинхронный вызов не должен делить контекст с другими асинхронными вызовами. Достаточно помнить, что каждый асинхронный вызов одного и того же метода — это запуск ДРУГОГО потока исполнения. Даже если низлежащий диспетчер будет использовать всего один поток для диспетчеризации. Решений тут несколько и все они точно такие же как для обычной многопоточности. От подхода "одна задача — один объект", до использования только локальных переменных в алгоритме, бо "линейность" дотнетных async/await позволяет это делать, т.е. автоматом будет обеспечено "одна задача — один объект".
I>Вот это интересно, а твои виляния со стороны в сторону никому не интересны.
Да не интересно это ни разу, бо разделяемые ресурсы могут быть всё-равно, хотя бы из-за 3-rd party libs. Я собирался показать профит от кооперативной многозадачности вокруг разделяемых ресурсов. А то, что ты от меня спрашиваешь, попахивает антипаттерном для многопоточности.
V>>Ctrl+Insert при открытом MessageBox, Shift+Insert в форум. I>Тебя это уже не спасёт
Та лан, ты был банально не в курсе.
I> ты по наличию Trace "задетектил" консольное приложение
Ес-но! Показать как в WinForms открыть консоль и выводить туда Trace? Сдается мне, что ты и это не в курсе... А я подумал было, что ты именно так и сделал.
Извини, извнини...
Здравствуйте, vdimas, Вы писали:
I>>Ты лучше покажи как забороть "коллизии" когда виндовый поток ровно один и пускает кучу асинхронных цепочек,
V>Дык, он и ДОЛЖЕН так делать. Своими случайными задержками ты затем меняешь асинхронные нити местами. Тут тоже всё ОК, я ХЗ что тебе не так.
Понятно, что должен. ТОлько если ты с базой или с файлом такое проделаешь, получишь непойми что.
V>Ответ — каждый асинхронный вызов не должен делить контекст с другими асинхронными вызовами.
ля-ля-ля. Представь себе, что read-write, это асинхронное АПИ БД или файловой системы.
V>Да не интересно это ни разу, бо разделяемые ресурсы могут быть всё-равно, хотя бы из-за 3-rd party libs. Я собирался показать профит от кооперативной многозадачности вокруг разделяемых ресурсов. А то, что ты от меня спрашиваешь, попахивает антипаттерном для многопоточности.
Понятно, значит асинхронного АПИ ты пока что не видел.
Здравствуйте, vdimas, Вы писали:
V>>>Ctrl+Insert при открытом MessageBox, Shift+Insert в форум. I>>Тебя это уже не спасёт
V>Та лан, ты был банально не в курсе.
Не в курсе чего ? Что ты Trace за консольное приложение примешь ? Конечно не в курсе, я то думал, ты еще программируешь.
I>> ты по наличию Trace "задетектил" консольное приложение
V>Ес-но! Показать как в WinForms открыть консоль и выводить туда Trace? Сдается мне, что ты и это не в курсе... А я подумал было, что ты именно так и сделал. V>Извини, извнини...
Ну да, у меня нет привычки притягивать к вопросу все смежные и вообще отвязные проблемы.
Здравствуйте, vdimas, Вы писали:
НС>>Он не тупо портированный, это МСовский компилятор J++ в девичестве и был, без всякого портирования. V>Тем более, что можно ждать от разработки 96-го года?
Напоминаю, компиляторы С++ еще старше.
НС>>Наконец, C# 1 и C# 5 это очень очень большая разница. V>Но и начинать не с 0-ля надо было.
Почему? Как раз таки с 0.
НС>>Работающий прототип, АФАИК, был написан Эриком за полгода чуть ли не в одиночку. V>Боюсь, прототип не показывал нужную скорость работы, которую мы обсуждаем.
Бойся. А если отвлечься от твоих фобий, то тот компайлер как бы не быстрее текущего был. Те вещи, которые помогли ему стать быстрее, закладывались с самого начала.
V>В общем, 5 лет на разработку компилятора — это действительно много
Как об стенку горох. Розлин это намного больше чем просто компилятор.
V>, как ни крути. Я знаю, что речь не столько о компиляторе, сколько о платформе для компиляторов...
А заодно о IDE. Но это ведь мелочь, настоящие перцы современную IDE пишут за пару месяцев.
V> но все-равно... "с их ресурсами!" (С)
Активно в Розлин стали набирать народ всего пару лет назад.
Здравствуйте, Ikemefula, Вы писали:
I>>>Ты лучше покажи как забороть "коллизии" когда виндовый поток ровно один и пускает кучу асинхронных цепочек,
V>>Дык, он и ДОЛЖЕН так делать. Своими случайными задержками ты затем меняешь асинхронные нити местами. Тут тоже всё ОК, я ХЗ что тебе не так.
I>Понятно, что должен. ТОлько если ты с базой или с файлом такое проделаешь, получишь непойми что.
Ну так не проделывай...
Давай ты обрисуешь саму проблему. Пока что я видел фундаментальное непонимание, как этой асинхронностью пользоваться. Помнишь паттерн асинхронных вызовов еще до async/wait? Как ты решал подобные задачи на нем? Помнишь, там был некий AsyncState? У тебя сей паттерн должен был быть уже на уровне мозжечка, тогда не было бы проблем. Сейчас происходящее эквивалентно тому паттерну с точностью до синтаксического сахарка. И тот же самый AsyncState на месте.
V>>Ответ — каждый асинхронный вызов не должен делить контекст с другими асинхронными вызовами.
I>ля-ля-ля. Представь себе, что read-write, это асинхронное АПИ БД или файловой системы.
Представь, что народ давно этим всем пользуется, еще до async/await. Без проблем.
I>Понятно, значит асинхронного АПИ ты пока что не видел.
Да тут уже понятно, кто, чего и когда видел.
Действительно, с async/await я плотно не работал. Удовлетворил несколько раз своё любопытство и всё. Этот сахарок построен на паттерне IAsyncResult, который идет еще с первого дотнета, давно на уровне мозжечка... и чьи ноги растут еще с паттерна виндов под названием Completion Routines. Т.е. там и спинной мозг скорее уже в деле, головой думать не надо, всё и так ясно... ))
Более того, сам объект Task очень похож на то, что мы писали уже не раз с разной степенью универсальности. Т.е. происходящее в коде тривиально — запускать необязательно. А ты тут вторую неделю откровенно плаваешь даже с запусками. Отсюда вывод (в который раз один и тот же!) — мало уметь пользоваться синтаксическим сахарком. Надо ясно представлять себе что происходит под ним. Желательно представлять до самого дна... Хотя бы чтобы не рассуждать на весь и-нет о "гонках изкаробки".
Легко и непринужденно можно без гонок. Не хочешь на досуге накатать простенький диспетчер для Task? Оч рекомендую. ))
Мне потом будет легче с тобой разговаривать.
Здравствуйте, Ikemefula, Вы писали:
I>Вобщем какая то мелочовочка, а совет использовать Refresh вместо Invalidate — для плюсовика это практически криминал
Какой нафик Invalidate???
Речь об обновлении св-в в дизайнере.
И да, в обычной прорисовке тоже часто пользуются Refresh, например для hover-эффектов или сопровождающих рисунков для drug&drop. В общем, оба раза мимо.
Здравствуйте, Ikemefula, Вы писали:
V>>Скользкий ты... Десятый раз уже убежал... I>Нет кода — нечего обсуждать.
Ну так дай свой код.
V>>Не приведя тут низлежащего кода под твоим скриптом или хотя бы словесного пошагового объяснения способа подсчета ссылок в своём примере, ты не даешь мне оснований ни для обсуждения твоего решения, ни для предложений альтернативного способа. Какое бы удачное решения я бы не привел, ты всегда можешь воскликнуть: "А я именно так и предполагал!". Кароч, так спорить не интересно.
I>Я показал АПИ и дал все нужные объяснения.
Я задавал конкретный список вопросов — в ответ полный ноль объяснений.
Своё "АПИ" можешь запихать себе куда подальше, тут достаточно было упоминания вида обертки. Договорились об управляемой среде. Дальше-то чего ты морозишься? Мне тебя долго пинать надо, пока ты разродишься пояснениями, откуда ты берешь эти свои бесконечные счетчики ссылок???
I>Людям "в теме" все ясно.
Люди в теме согласны с моим выводом, что на твоей умозрительной схеме наблюдается зацикленность на счетчиках ссылок.
I>Очевидно — ты не в теме, но пытаешься по привычки рассказать, что лучше всех все знаешь.
Ну так развей наши сомненья!!! Покажи или расскажи, где, в какой момент твои счетчики щелкают.
I>Теперь фокус — зануляем все ссылки a.b* и нативный объект должен быть разрушен автоматически. I>От тебя требуется показать, как это делается без счетчика ссылок.
Я тут это... Кароч, тут в редакторе постов видно [c#]некий код[/c#]
Т.е. речь о нейтивной обертки для управляемой среды, пральна?
I>Как это делать со счетчиком ссылок рассказывать не надо, и код просить тоже не надо, это и ежу понятно, что работает.
Нахрена тут счетчик ссылок вообще?
Не, не так.
НАХРЕНА???
Во.
================
Говорила же тебе мама — не прогуливай финализаторы в школе... Эх, ты...
V>>Это я даже обсуждать не намерен. Тебе дотнетная "линейная" асинхронщина дана как противопоставление событийному ООП-программированию. Кароч, тебе не надо хранить данные м/у вызовами "где-то", например, в полях класса, храни их в локальных переменных.
I>Шо, и базу со всеми таблицами и файл со всем контентом — все это в локальную переменную ? А ты, непростой !
А в чем проблема? Вы тут выступали за фукциональщину, то бишь за функциональную декомпозицию. Вам даже async/await для этого подогнали, чтобы объекты-автоматы не пилить вручную. Теперь же всё легко. Блесните воображением, как грится.
V>>И да. Читая твой код мне ни разу в голову не пришло, что 10000 будет правильный ответ. Я ХЗ что надо вообразить о своей программе, чтобы дать такое предположение. I>Это про твои умения чтения кода, задача то избитая донельзя.
Это у новичков разве что. Там такая же дотнетная асинхронность как была в первом дотнете. НИЧЕГО не поменялось. Кто раньше её не умел, тот и сейчас не сумеет.
Кароч, дальше локальных переменных и явно передаваемых контекстов не ходи и будет тебе счастье.
На досуге еще можещь почитать, для примера, асинхронный ввод/вывод на старых XxxBegin/XxxEnd, обрати внимание на AsyncState...
Не, я понимаю, что это уже почти "expert level"... Ну уж извини, асинхронщина она всегда такая.
I>>>Ты плохо понимаешь вопрос — от тебя требовалось пофиксить асинхронную часть, что бы выдать результат _resource == 10000
V>>Это ты формулируешь задачи. Как всегда — ближе к развязке. Для твоих целей объяви её локальной переменной. I>И всю базу данных поместить в эту локальную переменную ?
База сама умеет разные уровни изоляции.
Для остального — там, где нужна упорядоченность, дели алгоритмы на асинхронные и синхронные участки. Простой пример — параллельные вычисления. В конце обычно некий синхронный код, ожидающий конца вычислений кусочков и собирающий кусочки в целое. Это т.н. мастер-процесс. Сам этот мастер-процесс может точно так же быть фоновой задачкой, по отношению к основному потоку исполнения.
Кароч, про избитость задачи мне не втирай. Давай лучше конкретную боевую, оно разруливается на раз.
Здравствуйте, vdimas, Вы писали:
I>>Понятно, что должен. ТОлько если ты с базой или с файлом такое проделаешь, получишь непойми что.
V>Ну так не проделывай...
Сказать кастомеру что либы где асинхронное АПИ надо выбросить а проект закрыть ?
V>Давай ты обрисуешь саму проблему.
Уже все обрисовано, тривиальная проблема. Решается, как и раньше, асинхронным мутексом.
I>>ля-ля-ля. Представь себе, что read-write, это асинхронное АПИ БД или файловой системы.
V>Представь, что народ давно этим всем пользуется, еще до async/await. Без проблем.