Задать вопрос
  • Как реализованы асинхронные методы 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#").
    Касательно второго вопроса. Задачи, выполнение которых ожидает асинхронный метод, будут выполняться совершенно параллельно, каждая - в своем потоке из пула, возможно - на разных ядрах/процессорах). А асинхронный метод в это время не будет выполняться совсем: поток в котором он выполнялся, будет дальше выполнять код после его вызова в вызвавшем его методе (или код, возвращий поток в пул, если это был вызов машины состояний после ожидания). А после завершения обеих этих задач выполнение метода машины состояний, в который был преобразован асинхроннный метод, будет возобновлено и задача, которую возвратил асинхронный метод, будет завершена.
    Ответ написан
    Комментировать
  • Как мониторить программу в Windows?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    В Windows, вроде как, до сих пор сохранился штатный компонент SNMP Service (см., к примеру, здесь).
    А вообще, штатными для мониторинга именно Windows являются WMI и Performance Monitor API. И всческие универсальные программы мониторинга обычно умеют их использовать.
    Ответ написан
  • Как исправить ошибку 'Сервер LDAP недоступен' при подключении к LDAP на Windows Server 2022?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Неверное значение параметра конструктора LDAPConnection. Если используется конструктор, принимающий строку, то в строке должно быть имя (короткое или FQDN) или IP сервера, возможно - с добавлением через двоеточие номера порта - а у вас там URL.
    документация
    Ответ написан
    Комментировать
  • Как жестко привязать имя сайта к ip на контроллере домена?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Можно запретить второму КД через регистрировать свой IP с именем, совпадающим с именем домена (и при необходимости - удалить уже существующую запись вручную). Проще всего, IMHO, это сделать в локальной политике этого КД. Нужный параметр политики - Административные шаблоны/Система/Сетевой вход в систему/DNS-записи контроллеров доменов не регистрируемые контроллерами доменов: там в строке параметра дожен присутствовать элемент LdapIPpAddress. Только вот, не забыть бы ещё сделать нужные испавления при добавлении нового КД - рано или поздно это понадобится. Поэтому - документируйте.

    Но лучше сделать, как написал в своем ответе Руслан Федосеев - дать сайту с RDWeb отдельное имя, чтобы наверняка избежать конфликта с автоматически регистрируемыми записями.
    Ответ написан
    Комментировать
  • Можно ли через второго локального админа переименовать ПК и перезайти в домен?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Ввод ПК в домен и вывод из домена требуют полномочий в двух местах: на самом ПК и в домене. На самом ПК достаточно полномочий локального администратора. И их вполне достаточно, чтобы, по крайней мере, вывести ПК из домена -возможно, не почистив за собой, но, по крайней мере, ПК от домена вы отвяжете. С полномочиями в домене могут быть разные варианты, поэтому, если у вас есть человек, отвечающий за домен, лучше обратиться к нему.

    Например, он может сбросить существующую учетную запись ПК в домене, и вы сможете ввести ПК в домен под тем же именем.

    То, как хотите сделать вы, скорее всего (как я писал, возможны варианты, в зависимости от настроек(, сделать возможно, но будет несколько неаккуратно: например, в домене останется учетная запись ПК со старым именем.
    Ответ написан
    Комментировать
  • Почему я получаю ObjectDisposedException из за DbContext-а? Когда он очищается?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Я не вижу откуда у вас вызывается JobWasExecuted, поэтому ответ пока будет чисто теоретический. Контекст БД (потомок DbContext), получаемый из контейнера DI в настроке по умолчанию (как у вас, судя по написанному), имеет время жизни Scoped. То есть, при обработке запросов к веб-серверу он создается отдельно для каждого запроса и очищается при завершении обработки этого запроса.

    Просто так взять и обратиться к такому контексту из других частей программы, которые могут работать независимо от обработчика запроса (например, из фонового сервиса) нельзя: после завершения запроса получите именно такую ошибку.

    Так что, если вам нужно получить контекст БД с нестандартным временем жизни, придется отказаться от получения его через DI со стандартной настройкой.

    Время жизни контекста, получаемого через DI, можно изменить, но тут надо хорошо понимать, что и как вы делаете. Например, к DbContext нельзя обращаться параллельно из нескольких потоков - но при типичной обработки запроса такого и не случается. Так что у меня есть сомнение что вам стоит менять штатную настройку.

    Штатным способом получения контекстов с нестандартным временем жизни является сервис фабрики на базе DbContextFactory (его тоже можно получить через DI, как - см. документацию). Но следить за временем жизни такого контекста вам придется самостоятельно.
    Ответ написан
    1 комментарий
  • Где хранится список black ip IIS 10?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    В apphost.config, для IIS, который идет в составе ОС, это %windir%\System32\inetsrv\config\applicationHost.config (для IIS Express - в другом месте). Интересующая вас секция (имя в формате для appcmd, т.е. последовательность вложенных элементов XML) - system.webServer/security/ipSecurity. Документация тут.
    Ответ написан
  • Почему данные из представления не передаются в модель в ASP.NET?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Источник проблемы с привязкой действия: в теле ответа у вас нет ничего, кроме antiforgery token. Так что надо смотреть на клиенте HTML, который сгенерил движок представления - похоже, кривизна там, форма сгенерена неверно.
    Перед просмотром имеет смысл включить для окна/вкладки, где будет страница с формой, средства отладки браузера (F12) и смотреть ошибки, которые они выведут - может, они что найдут в авттоматическом режиме.

    Конкретную причину ошибки я пока не опознаю. Подозрение у меня вызывает атрибут asp-for=Id для первого элемента формы: значения атрибутов tag helper чисто по синтаксису надо указывать в кавычках, потому что они подчиняются тому же синтаксису, что и обычные атрибуты HTML. Но в этом ли причина, утверждать не могу.
    Ответ написан
  • Какие права получает учётная запись в Windows, не входящая ни в одну группу?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Маркер доступа, создаваемый для любой учетной записи содержит хорошо известный идентификатор безопасности(SID) для Everyone(Все). Маркер для любой учетной записи, прошедшей аутентификацию (не гостевой), содержит SID Authenticated Users(Прошедшие проверку). Маркер для учетной записи, выполнившей вход в систему содержит SID, соответствующий типу входа: Interactive и пр. И там может ещё некоторое количество хорошо известных SID, назначаемых процессом входа в систему. Чтобы посмотреть их конкретно для учетной записи, выполните команду whoami /groups.
    Этот набор SID и определяет разрешения на доступ к объектам в системе.

    PS А ешё кроме разрешений у учетной записи могут быть привилегии, не связанные с объектами.
    Ответ написан
    2 комментария
  • Можно ли использовать Expression без типов-делегатов?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вкратце: не заморачивайтесь.
    В ремесле программирования есть полезный принцип, обозначаемый англоязычным сокращением YAGNI, что в переводе означает "Вам это не понадобится." Согласно этому принципу, раз вы не знаете, как можно использовать Expression с параметром-типом не являющимся делегатом, то вам вряд ли понадобится его так использовать.
    А проверки параметра-типа там нет, скорее всего, потому что эта функциональность (она называется Expression trees) появилось давно, больше 15 лет назад, в .NET Framework 3.5, а тогда в .NET проверки параметра-типа ЕМНИП не было.
    Но, подозреваю, что попытка использовать в качестве TDelegate не тип-делегат просто приведет к ошибке: почти наверняка - при попытке получить исполняемый код из выражения (метод Compile), а, возможно, и раньше - или при попытке создания объекта, или даже на этапе написания кода или компиляции: ее может (да или нет - не проверял) обнаружить анализатор при компиляции исходного кода и даже IntelliSense. И подозреваю, что при попытке обойти дерво такого объекта Expression tree (это - альтернативный способ использования этой функциональности), тоже будет ошибка - ибо выражение получается бессмысленным.
    В любом случае, истиной в последней инстанции является исходный код. Если вам так уж захотелось узнать, что будет - читайте исходный код: он лежит на GitHub, ссылка есть в документации по классу в learn.microsoft.com (сразу предупреждаю: там все сложно).
    Ответ написан
    Комментировать
  • Как реализовать потоковое заполнение массива другим потоком?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Сколько там недочетов. потенциальных ошибок. неверных решений?

    1. У вас намешаны синхронная - в с одном потоке с блокировками (Wait, Sleep) - и асинхронная (async/await) многозадачность Теоретически, совмещать их можно, но лучше остановиться на каком-то одном подходе - легче будет. Синхронное выполнение задач (каждая - в своем потоке, который она блокирует по необходимости) - это проще, но асинхронное выполнение (при которм поток не блокируется, а освобождается, а задача планируется для продолжения после завершения операции в свободном потоке) позволяет получить больше производительности. Вот и выбирайте, что вам нужнее.
    2. Для синхронизации используйте не переменные (а, к примеру, isRun у вас используется именно для этого), а объекты синхронизации. В частности, isRun следует заменить на объект синхронизации. Для синхронного выполнения лучше всего IMHO подойдет ManualResetEventSlim. для асинхронного - что-нибудь, на чем можно сделать await (например, TaskCompletionSource.Task).
    3. Любой доступ к совместно используемым в разных задачах объектам(ресурсам) следует синхронизировать путем захвата связанного с ресурсом объекта исключающего доступа. Для синхронного выполнения подойдет оператор lock (вижу, что вы его уже используете). Для асихронного выполнения lock можно использовать, но - только если в его теле нет await (и компилятор вам не позволит нарушить это правило). Не пытайтесь обойти это правило, используя вместо lock другие объекты синхронизации, подразумевающие захват владения на уровне потока (Monitor, Mutex...) - компилятор всего лишь не сможет вам помешать сделать ошибку. В таком случае для синхронизации можно использовать SemaphoreSlim, но это требует понимания и аккуратности, поэтому подробности пока не пишу.
    Думаю, пока этой информации к размышлению вам хватит.
    Ответ написан
    1 комментарий
  • Почему такая скорость копирования?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Обращает на себя внимание тот факт, что скорость копирования совпадает с со скоростью записи с произвольным доступом. То есть, похоже что линейная запись на виртуальный диск оказывается, с точки зрения ваших HDD записью с произвольным доступом.

    Смотреть надо там. Но я не знаком детально с ZFS, поэтому не могу подсказать, что и как вам надо посмотреть.
    Ответ написан
    Комментировать
  • Почему Server 2016 и server 2003 не понимают друг друга?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Копать тут - в поддерживаемые протоколы шифрования для Kerberos: недоступность по имени при доступности по IP - вообще типичный признак проблем с Kerberos, а тут ещё в наше время MS повадилась отключать старые протоколы как "небезопасные" - потому что безопасность (показная) стала продаваемой, ее якобы наличие увеличивает ценность продукта в глазах клиентов.
    Ответ написан
    1 комментарий
  • Почему не применяются политики в OU?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    У политик есть две части (конфигурация и предпочтения) - для компьютера и для пользователя. Каждая часть применятеся для иерархии подразделений(OU), где находится учетная запись соответственно компьютера и пользователя.
    Давайте я попробую угадать: вы настроили в политике часть, применяемую для пользователя, и привязали ее к OU, где находится учетная запись компьютера, так? Так оно по умолчанию не работает. Что делать - это зависит от того, что вы хотите. Если вам нужно настроить политику для пользователя независимо от компьютера, где он работает - привяжите политику к подразделению, где находится учетная запись пользователя. Если вам нужно настроит политику для пользователя, чтобы она применялась на компьютерах указанного подразделения - включите в части политики для компьютера действующей на это подразделение режим замыкания (loopback processing).
    Ответ написан
    Комментировать
  • Как отключить добавление DNS суффиксов?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    nslookup использует свой собственный компонент разрешения имен DNS, а не системный, и потому суффиксы он дописывает сам.
    Если вам нужно, чтобы nslookup не дописывал суффиксы - просто поставьте в конце имени точку: "nslookup ya.ru."
    Ответ написан
    6 комментариев
  • Как переадресовать с внешнего домена на внутренний через dns?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    У вас сервер DNS на КД является полномочным для зоны домена example.ru. Поэтому все записи он разрешает чеез свою зону (обычно - интегрированную с AD). Менять такую настройку не надо - иначе замучаетесь с настройко домена AD. Надо решать задачу по-другому, через имеющуюся внутреннюю копию зоны.

    Задача, на самом деле распадается на две:
    1. Настроить публикацию сайта с именем, совпадающим с именем домена
    2. Настроить публикацию других сайтов
    Вариантов решения первой задачи два. Как известно, по умолчанию КД по умолчанию регистрируют записи A с именем домена и своим адресом. Поэтому нужно сделать одно из двух:

    1. настроить на всех КД обратный прокси для публикации внешнего сайта, совпадающего с именем домена. Для IIS для этого используется модуль ARR (Application Request Routing).
    2. Запретить через политику (Default Domain Controller Policy)регистрацию КД записей A с именем домена. Это можно делать практически безопасно - эти записи нужны только для устаревших ещё во времена Windows 2000 клиентов LDAP, которые ищут сервер LDAP домена по записи типа A с его именем. Все хоть сколько-нибудь современные клиенты (включая саму Windows) ищут сервер LDAP для домена по записям SRV. Нужный раздел политики - Конфигурация Компьютера/Административные шаблоны/Система/Сетевой вход в систему/DNS-записи локатора домена/DNS-записи контроллеров домена, не регистрируемые контроллерами домена: добавьте туда слово LdapIPAddress.

    А для других сайтов просто добавьте в зону домена их имена с нужными IP.
    Ответ написан
  • Поиск куда можно добраться по графу за время?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Алгори́тм Де́йкстры (англ. Dijkstra’s algorithm) — алгоритм на графах, изобретённый нидерландским учёным Эдсгером Дейкстрой в 1959 году. Находит кратчайшие пути от одной из вершин графа до всех остальных.

    Здесь
    Ответ написан
    Комментировать
  • Можно ли как-то откатить локальный репозиторий до локального коммита?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Как-то - можно, если вы зафиксировали изменения, конечно - а, как вы пишете, вы их зафиксировали.
    Для начала, посмотрите, что вы там делали, с помощью git reflog: там зафиксированы и коммиты, и переключения веток. Думаю первых десяти записей (git reflog -10) вам хватит, если нет - увеличьте число в команде.

    Скорее всего, вы быстро увидите название ветки, с которой переключились на main, после вы этого сможете переключиться обратно на нее с помощью git checkout.
    Ответ написан
    1 комментарий
  • RADIUS (Windows) c какой ролью можно совместить?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    C AD DS (т.е. , контроллером домена): серверу RADIUS не придется лишний раз лазить в сеть.
    Ответ написан
    Комментировать
  • Как в C# в динамике задать у обощенного класса тип поля хранимого значения?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Для задания динамического типа для поля в C# есть ключевое слово dynamic. Но на самом деле, это - object, просто для него компилятор автомтически реализует преобразование типов (и ещё кое-что - см. [документацию](https://learn.microsoft.com/en-us/dotnet/framework...) она хотя и по Framework, но многое из этого есть и в .NET(Core и современном))
    Ответ написан