Задать вопрос
  • Как реализованы асинхронные методы c#?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вот вам перевод (часть первая, а всего там шесть частей) фундаменнтальной статьи по async/await одного из разрабочиков .NET в Microsoft (а именно - Stephen Toub).
    Читайте и просвещайтесь.

    PS Автор вопроса никак не желает считать текст выше ответом на свой вопрос - а зря. Потому что по-другому на форуме на него не ответишь - слишком много букв писать надо. Но сегодня - выходной, так что - попробую.
    И самое главное, что вам следует осознать - что код асинхронного метода, который вы написали, и код машины состояний, в которой он преобразуется (и далее - транслируется в IL и компилируется в команды процессора) - это два разных кода, пусть и эквивалентных.
    Если очень вкратце:
    • компилятор преобразует код асинхронного метода до неузнаваемости, в ту самую "машину состояний": класс, в котором есть метод, ее реализующий, и есть поля для данных, как нужных для работы самой машины состояний (в частности - для хранения состояния), так и для хранения локальных переменных исходного метода (да-да, в стеке они не хранятся);
    • каждый кусок исходного метода - начальный, между двумя await и завершающий - преобразуется в отдельный кусок метода машины состояний, выполняемый, когда выполнение машины состояний возобновляется в определенном состоянии; этот код производит действия, определенные в этом куске метода, и либо меняет состояние на новое значение и переходит к ожиданию (там, где в исходном асинхронном методе написан оператор await), либо завершает выполнение метода машины состояний;
    • для выполнения перехода к ожиданию используется объект awaiter'а, получаемый методом GetAwaiter() операнда операции await;
    • перед переходом к ожиданию проверяется возможно продолжение без ожидания, если это возможно (метод IsCompleted() awaiter'а возвращает true), то ожидания не происходит, а возобновляется выполнение машины состояний уже для нового состояния;
    • запуск ожидания происходит во внешнем относительно асинхронного метода коде - в объекте awaiter'а;
    • и при завершении метода машины состояний, и при запуске ожидания метод машины состояний возвращает управление в код, который вызвал в этот раз метод машины состояний (для одного вызова асинхронного метода вызовов метода машины состояний может быть много, см. дальше);
    • первый возврат из метода машины состояний происходит в вызывающий метод, он возвращает объект задачи, позволяющий отследить в вызывающем методе завершение работы машины состояний ( и тут есть нюанс, связанный с возвращением ValueTask, а не Task);
    • при окончательном (а не при запусе ожидания) выходе из метода машины состояний этот возвращенный объект задачи завершается;
    • после завершения ожидания метод машины состояний вновь вызывается: в типичном случае - в свободном потоке из пула потоков, но возможны варианты (какие - курить тему Synchronization Context); и он продолжает свое выполнение для нового состояния

    Это - максимально урезанное описание работы асинхронного метода.
    Если вы смогли из этого описания понять ответ на ваш первый вопрос - хорошо. Если нет - читайте статьи(ссылка выше), или книги (лично я рекомендую главу про асинхронные меотоды из книги Рихтера "CLR via C#").
    Касательно второго вопроса. Задачи, выполнение которых ожидает асинхронный метод, будут выполняться совершенно параллельно, каждая - в своем потоке из пула, возможно - на разных ядрах/процессорах). А асинхронный метод в это время не будет выполняться совсем: поток в котором он выполнялся, будет дальше выполнять код после его вызова в вызвавшем его методе (или код, возвращий поток в пул, если это был вызов машины состояний после ожидания). А после завершения обеих этих задач выполнение метода машины состояний, в который был преобразован асинхроннный метод, будет возобновлено и задача, которую возвратил асинхронный метод, будет завершена.
    Ответ написан
    Комментировать
  • Как найти работу, если есть большой опыт, но всё равно не берут?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    6 лет - это не большой опыт. Средний миддл примерно. Причём при условии фуллтайм работы в офисе/команде. А в 19 лет это считай вообще 0 лет реального опыта. 18 лет - окончание школы, 19 - возврат из армии. Т.е. уровень джуна примерно. Откуда возьмутся 6 лет опыта? Даже если вы все эти шесть лет занимались работой каждый день по 8-10 часов, то возникает вопрос - а на остальное образование вы забили болт? Да и кто вообще школьника возмёт на полную ставку? Это незаконно. Законно фуллтайм вы работать не могли. Так кому нужен человек без среднего образования? А если нет, то слова про "шесть лет большого опыта" - это враньё. Кому нужен человек, который уже в резюме врёт? Поэтому вас сразу заворачивают. Вот на вакансии уровня джуна и начального мидла, в лучшем случае, вам и следует нацеливаться. Тем более без ВО. Так же следует подготовить качественное резюме и CV согласно современным стандартам и рекомендациям. И без фантазий про шесть лет опыта. Отдельно указать официальные места работы и фриланс. Разработка ПО, системное администрирование, дата-инженерия, тестирование - это всё разные профессии.
    Ответ написан
    Комментировать
  • Можно ли стать бекэндером без фронтенда?

    Lord_of_Rings
    @Lord_of_Rings
    Дунадан - северный странник. Злой, но очень добрый
    Конечно можно. Бэкенд+фронтенд это уже фуллстэк. Но самые примитивные и базовые знания лучше все-таки иметь.
    Ответ написан
    Комментировать
  • Реально ли студенту найти работу, связанную с сетями?

    opium
    @opium
    Просто люблю качественно работать
    Ну если студент ищет то сразу найдет если не ищет то не найдет
    Ответ написан
    Комментировать
  • Как в корпоративном секторе ведётся учёт времени на задачу?

    "Думал" - это такая же часть реализации, как и "писал", так что выделять отдельно её нет никакого смысла.

    Другое дело, что если задача большая и непонятная, то её декомпозируют на "исследование", "проектирование", "мониторинг после деплоя" и т.п. И каждый такой этап - это, по сути, отдельная (атомарная) задача.

    У нас при этом принято каждый день отмечать потраченное время в задачу и оставлять комментарий, если это время ушло на что-то необычное ("не работал сервер", "пошёл не по тому пути" и т.п.). Системно за этим никто не следит, но иногда такие комментарии помогают на ретроспективах/постмортемах или клиенту доказать, что перерасход по задаче был не по нашей вине (а потому что требования в процессе они меняли три раза и не могли два месяца выделить ресурсы) и его придётся оплатить.
    Ответ написан
    5 комментариев
  • Есть смылс использовать Getway в asp.net core?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    главный принцип микросервисной архитектуры — отсутствие единой точки входа для всех микросервисов

    Наличие или отсутствие шлюза - это не принцип и уж тем более не главный, а шаблон, у которого есть плюсы, минусы и области применения.
    Ответ написан
    Комментировать
  • Какие есть хорошие ресурсы для изучения Docker для Golang?

    @Araya
    Никакой связи нет между докером и разбиением на слои.
    Найди любой хороший проект, а как подключаться к базе уже другой вопрос, go приложение не знает ни о каком докере.
    Ответ написан
    Комментировать
  • Стоит ли указывать паспортные данные в анкете соискателя?

    Крайне странно предоставлять свои паспортные данные для чего-то кроме составления трудового договора.

    Как-то мне тоже подобную анкету давали, и ещё анкету с инфой по родственникам тоже.
    Я просто спросил "а обязательно их вообще заполнять, а можно отказаться?" Мне сказали, что можно не заполнять и трудоустройству это никак не помешало
    Ответ написан
    Комментировать
  • Нормально ли использовать var вместо явной типизации в C#?

    1. Да, это нормально. Сильно легче код писать таким образом. (а иногда и читать, тк меньше слов дублируется. Например совершенно никакой ценности не несёт User user = userRepository.GetUserById(...) или многослойный женерик)

    2.

    Я ужасно ненавижу такой подход, потому что ты не можешь сразу определить тип, который возвращается.

    А ты давай нормальные названия методам, чтобы возвращаемое значение было очевидным, набирайся опыта, ищи закономерности.

    Ты же не задаёшься вопросом, какой тип возвращает какой-нибудь GetUser, ToString, TryParse, FirstOrDefault?

    Если тебе сложно понять смысл кода без типов - значит кто-то плохие имена дал переменным.


    Данный код достаточно сложно разобрать человеку, который не писал это всё с нуля, а был присоединён через 4-5 лет ведения проекта.

    Очень смелое заявление, которое мало чем подкреплено.


    Как по мне, добавление возможности писать var вместо обычного типа было ужасной ошибкой Microsoft. Сам var был добавлен в язык вместе с анонимными типами и предназначался специально для них.

    1. var далеко не только для анонимных типов полезен, хотя с анонимными типами без var работать было бы очень сложно.

    2. Тренд говорит об обратном - автоматический вывод типов сейчас есть практически во всех статически-типизированных языках в том или ином виде.

    Ну и помни ещё, что ты же не в блокноте код пишешь - у тебя есть всякие inlay hints, которые могут рядом с именем переменной показать её тип, а наведя мышку на слово - ты узнаёшь о нём все (имя переменной, сигнатуру метода, документацию, итд)
    Ответ написан
    7 комментариев
  • Нормально ли использовать var вместо явной типизации в C#?

    xez
    @xez
    TL Junior Roo
    Вполне норм. Просто тип определяется справа, а не слева.
    Подсказки ide должны решить вопрос понимания человеком, что там за тип.
    Ответ написан
    5 комментариев
  • Стоит ли делать отдельный микросервис для Баз данных?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Кто то счетает это хорошей идеей, как возможность связать все сервисы

    Тем временем центральная идея микросервисов в том, чтобы связанность максимально снизить.
    Ответ написан
    Комментировать
  • Как подключить proto файлы к проекту?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Клик сюда
    660ebe1a9e832661047201.jpeg

    Далее сюда
    660ebe371e0df243799837.png

    Подключаете .proto файл. После этого делает Rebuild вашего solution'а. Потом даблклик по проекту, в этом .csproj файле ищите секцию ItemGroup в которой будут ваши Protobuf. К ним додаёте аттрибут ProtoRoot, который (Для удобной работы) должен быть таким же как и пусть в аттрибуте Include без указания названия файла .proto

    UPD:
    Так же стоит отметить, чтобы импортировать в .proto ваш другой .proto, они должны быть хотя бы на одном уровне. Другими словами, вы можете импортировать только файлы, который находятся по архитектуре на том же уровне или ниже, потому что в import запрещено использования символа точки и запятой. Это значит, что вы не сможете выйти на уровень выше
    Ответ написан
    7 комментариев
  • Миддл без юнит тестирования?

    Апплайся на мидла, а там разберутся.
    Ответ написан
    Комментировать
  • В поиске первой работы програмистом, предлагают бесплатную стажировку. Соглашаться?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Народ тут накинул на вентилятор, попробую раскидать по фактам: Варианта на самом деле 3, но мы сведем к очевидным 2:
    1) Вы ищете первую работу в стеке, из опыта у вас приложение ТуДуЛист и Хеловорлд.
    Такое предложение как минимум подарок, как максимум большая удача. Подарок если вам просто дадут поколупаться в серьезном проекте и покажут как работает команда в целом. Большая удача если при этом у вас будет вменяемый ментор и ревьювер, а кода писать вам дадут много. Для конторы это скорее всего в минус, но если у вас все пойдет норм, то к концу срока вы в любом случае уже будете тянуть на джуна. Даже если после этого вы расстанетесь, опыт штука которая навсегда останется с тобой, в крайнем случае вы в первый месяц можете спокойно свалить, если видите что вам там ничего не светит в плане роста. Короче кейс - "надо брать".

    2) Вы уже работали со стеком, знаете как работать с основными инструментами и работали с проектами посложнее чем в первом варианте.
    Если еще и в конторе с какой-никакой командой, то вообще другой коленкор. В данном случае спокойно отказывайтесь, если вам жалко 3 месяца нахаляву работать. Опять же, неплохо было бы хотя бы узнать что в эти 3 месяца вы будете делать забесплатно, возможно ли перейти сразу к фазе 2 в случае вашей очевидной компетенции и т.д., короче есть смысл разговаривать ртом. Короче кейс - "надо поговорить".

    третий вариант по сути нечто среднее, но опять же сводится к 2 - надо говорить.
    Ответ написан
    3 комментария
  • Где искать верстальщиков и бекендеров?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    не справился, пропал, дико задержал
    По тому что чисто версткой заниматься могут только от безнадеги полные неумехи/новички, или в другой крайней ипостаси - работники постигшие этот мир и им этот мир абсолютно понятен, и они здесь ищу только одного - огромных денег за свое бесконечно-вечное. С бэкендерами тоже сложно, на вольных хлебах это редкий зверь, а на фрилансе он пасется только с условием, что капуста за разовый напряг будет крупнее кочана на постоянном месте работы, ибо нафига тогда париться.

    Короче, на фрилансе и прочих вольных пастбищах чаще всего пасутся 2 типа: Индусы по доллару за пучёк, и профи (скорее всего тоже индусы, но постигшие мудрость Шивы), работающие за ценник сильно выше часовой оплаты на ставке.
    Ответ написан
    Комментировать
  • Где найти других программистов?

    @vvlch
    самое популярное сейчас - не дискорд или форумы, а телеграм-чаты. их много, людей там много, активного общения тоже много

    вот самый полный список со списками, есть группировка по тематике и всё такое.
    по плюсам, например, сразу несколько чатов нашлось поиском по странице
    https://github.com/goq/telegram-list
    Ответ написан
    Комментировать
  • Как намекнуть начальству, что agile не избавляет от тз?

    @Zephyroche
    Исходя из ваших ответов и комментариев, очевидным выходом будет сменить работу и не пытаться что-то кому-то объяснить или намекнуть
    Ответ написан
    Комментировать
  • Стоит ли выбирать ИП, СЗ вместо ТК?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    За редкими исключениями ИП/СЗ - это либо галеры, либо временные сотрудники на малозначимых должностях. Так что вы этим сильно ограничиваете для себя рынок труда и ухудшаете условия труда.
    Ответ написан
    1 комментарий
  • Где найти недостающие куски пазла, что лежат между сеньором и архитектором?

    opium
    @opium
    Просто люблю качественно работать
    Чувак у тебя гигантский опыт в 20 лет и если ты не можешь ответить на эти вопросы то наверно уже и не надо, в целом этого срока достаточно чтобы уже уходить на пенсию
    Ответ написан
    5 комментариев
  • Почему C# не кроссплатформенный?


    Почему C# не кроссплатформенный?

    На этот вопрос нельзя ответить сразу по двум причинам:
    1. C# - это язык, а язык не может быть кросс-платформенным, так как платформы в разрезе языка и нет.
    2. .NET уже много лет как кросс-платформенный.
    Начиная с уже мейнстримного .NET 8, заканчивая mono и всякой экзотикой типа nano framework


    но при этом, это не так

    Ничто нельзя запустить на "чём угодно"


    но в неё вопрос кроссплатформенности решена абсолютно полностью

    Если вопрос "абсолютно полностью" решён, то почему я не могу запускать программы, написанные на Java, на любом железе?
    Ответ написан
    Комментировать