Задать вопрос
  • Как дождаться выполнения асинхронного метода?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    SomethingFuncCatch().Wait();
    В Wait дополнительно можно передать таймаут и/или CancellationToken (см. описание метода Task.Wait ).

    Только вот, боюсь, что вы не дождетесь когда закончится цикл
    while (i > 0)
    {
        Console.WriteLine("NewProcess started");
        i = i--;
    }

    Ибо вы в нем пытаетесь присвоить i то значение, которое было до уменьшения на 1.
    Ответ написан
  • Нормально ли использовать var вместо явной типизации в C#?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вынесено из комментариев.
    Василий Банников , ну, что вам на это сказать?
    Сильно легче код писать таким образом.
    Писать - да, читать - it depends, как говорят англичане.

    Если тебе сложно понять смысл кода без типов - значит кто-то плохие имена дал переменным.
    А разве в legacy 4-5-летней выдержки, над которым поработало много программистов, хороших и разных, по-другому бывает? А ещё имена могут дать хорошие, понятные - но основанные на системе понятий, которая нетривиальна и не попала при этом в документацию. Чтобы понять, о чем я - попробуйте почитать исходники подсистемы маршрутизации в ASP.NET Core. лучше всего - после работы с чем-нибудь типа MVC или Razor Pages: сомневаюсь, что вы сразу въедете, что Model там и Model тут - это разные Model.

    А ещё бывает, что методы называются почти одинаково, но типы значений у них разные. Пример: builder.Services.AddOptions() и builder.Services.AddOptions<TOptions>() из кода конфигурирования контейнера сервисов, методы расширения IServiceCollection для Option Patterns - типы возвращаемых значений у них разные. А их ещё любят цеплять друг к другу к таким же методам через точку - вот и смотри потом, чой-то в ConfigureOptions какие-то лишние параметры вылезли.

    с анонимными типами без var работать было бы очень сложно.
    Правильный вопрос - зачем вообще заставлять работать с анонимными типами? Подозреваю, что их из-за маршрутизации в MVC завезли - как типы параметров, вместо того, чтобы передавать в методы генерации ссылок вместо IDictionary<String,Object>, как это оно там реально требуется. Но, в Microsoft решили, видимо, тогда не делать инициализаторы для словарей (при том, что потом всё равно сделали, не отвертелись), а притащить вместо них анонимные типы (интересно откуда - неужели прямо из JS?). Но это не точно. (Ага, в комментарии мне напомнили про LINQ)

    Тренд говорит об обратном - автоматический вывод типов сейчас есть практически во всех статически-типизированных языках в том или ином виде.
    Это потому что сейчас главное - быстрее писать MVP, для веба - особенно. Ну, а потом можно сказать волшебное слово: "Legacy".

    Ну и помни ещё, что ты же не в блокноте код пишешь
    Но читаешь-то ты его не только в IDE. В частности, MS в своей документации на сайте в примерах очень любит писать var - вот и выбирай потом, что делать: лезть прямо сразу в документацию по API (а ссылки отнюдь не прилагаются) или рисковать упустить что-то важное? А если ещё учесть, что сейчас принято документацию ограничивать примерами (MS любит, да) - оно вообще весело.

    Но, с другой стороны, автор вопроса, похоже, с трех- и более этажными дженериками ещё не сталкивался (ну, или забыл, как они выглядят) - там без var тоже грустно.
    Как-то так
    Ответ написан
    2 комментария
  • Для чего нужна отмена задач, кроме таймаутов и каналов?

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

    В качестве примера: пользователь послал на сервер через веб-страницу запрос и ждет результата. Представим, что запрос - сложный, результат так сразу не получить, запрос выполняется, а пользователь ждет, потому что всё это понимает. Потом пользователю внезапно надоедает ждать и он посылает команду Отменить. Или - закрывает страницу. Так вот, по-хорошему, в этом случае надо отменить задачу, которая выполняет запрос, чтобы она не тратила впустую ресурсы сервера.

    А ещё отмена полезна для прерывания процессов потенциально бесконечных, типа смотреть, как горит огонь, как течет вода, как люди работают... :-)

    Таймауты тут не помогут в обоих случаях. В первом случае пользователь сам часто не знает, сколько он согласен ждать, а во втором - вообще нет никакого таймаута, ибо процесс бесконечен.
    Ответ написан
    Комментировать
  • Миграция вылетает по Stack Overflow. Есть ли ограничение на объем данных в миграции?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Причина ошибки, как пишется в сообщении о ней - переполнение стека. Размер стека для потогков определяется процессом, в котором работает приложение. Обычно он фиксирован и записан в заголовке .exe. Если при размещении веб-приложения в своем процессе (так делается запуск из Visual Studio) стека хватает, то настройте размещение приложения вне процесса и в IIS: документация - здесь, по умолчанию AFAIK для IIS используется размещение приложения ASP.NET Core внутри его рабочего процесса, и используется размер стека этого рабочего процесса.

    PS А вообще, я бы на вашем месте пересмотрел код миграций и использовал стек (локальные переменные методов имеющие тип значений, память, отводимая через stackalloc и т.п.) в нем по минимуму. Потому как требования к памяти приложения имеют свойство расти со временем, а стек задается фиксированной величиной.
    Ответ написан
    Комментировать
  • Имя "c" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Как исправить?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Запускать "операторы" из командной строки (cmd.exe в Windows или sh и пр. в *nix). Потому что синтаксис этих команд - не Powershell'овский. Ну, или переделать эти команды под Powershell.
    Ответ написан
    Комментировать
  • Почему на многих крупных сайтах не используются смысловые теги main,section, article, aside, header, footer?

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

    Короче, смысловая разметка подобна Скрипачу: "А Скрипач не нужен, дорогой.".
    Ответ написан
    Комментировать
  • Почему получаю System.InvalidOperationException: No authentication handler is registered for the scheme?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вы неправильно используете метод ControllerBase.Forbid. Передаваемая в него строка (она, как понимаю, преобразуется в массив строк из одного элемента) - это не сообщение об ошибке, а название использованного метода аутентификации.
    Ответ написан
    Комментировать
  • Как добавить одно поле множеству классов без применения наследования и добавления поля в каждый класс по отдельности?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Привыкли к миксинам в языке с динамической типизацией? В C# их нет, и вряд ли будут, потому что типизация тут статическая. И приемы программирования - соответственно, другие.

    В частности, чтобы добавить дополнительное свойство (или метод) в классы из разных иерархий наследования, используйте интерфейс. Примерно так (примеры - на основе кода из комментариев):
    public interface IChosable {
        bool IsChosen {get; set;}  //Желательно имена писать таки на английском правильном
                                                 // а не ломаном. А то глаза режет.
                                                 //Ну, или хотя бы - по русски транслитом: 
                                                 // Vybrano вместо IsChoised - и то лучше, IMHO
    }
    
    //...
        public class ViewedDirectoryData : DirectoryDataEntity, IChosable
        {
            public bool IsChosen {get; set;}  
        }
    
        public class ViewedOutputData : OutputData, IChosable
        {
            public bool IsChosen {get; set;}  
        }

    Но свойства, таки да, придется определять в каждом классе, реализующем интерфейс (но можно перенести их, вместе с указанием реализации интерфейса, в базовые классы иерархий).

    Удобство тут в том, что ссылку на любой из классов, реализующих интерфейс, можно привести к типу интерфейса - тогда и статический контроль типов сохраните, и работать со всем этими классами можно будет единообразно.
    Ответ написан
  • Linux. Через роутер в виртуалку на хосте ICMP идет, а TCP нет. Почему?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Возможно, прямые и обратные пакеты между 192.168.0.0/24 и 192.168.2.0/24 у вас ходят разными маршрутами. В наше время это проверить сложно, потому что современные устройства любят резать опцию записи маршрута в эхо-пакеты ICMP (в ping она включалось ключем -r 9).
    TCP, в отличие от ping, нужно установленное соединение, а роутер (брандмауэр на нем) может контролировать, что соединение установливается правильно. И если он видит пакеты только в одну сторону, то может блокировать соединение.

    Для проверки добавьте маршрут в 192.168.2.0/24 через Linux(192.168.0.101) на тот узел в 192.168.0.0/24, с которого вы пробуете wget. На Windows это делается командой route add 192.168.2.0 mask 255.255.255.0 192.168.0.101 (работает до перезагрузки).

    Если это решит проблему, то добавьте этот маршрут на постоянку - это можно сделать через DHCP или прописать маршрут вручную напостоянку (в Windows для этого используйте route add -p и далее по тектсту). Можете также попробовать отключить брандмауэр на роутере для внутренней сети (как это сделать и можно ли - это мне неведомо, я модель вашего роутера и что он может не знаю, я такое поведение на MS ISA Server в древности наблюдал).

    PS Вообще-то, если подключать виртуалку через именно мост ("на уровне L2"), то она должна иметь/получить адрес из той же подсети, что и хост, но тут я выяснять, что вы там на самом деле сделали, не хочу.
    Ответ написан
  • Как создать экземпляр экземпляра класса?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вы неправильно понимаете класс enum. enum - это не класс, а ключевое слово языка C#.

    PS
    И я задумался:
    Надо не думать, и даже - не знать. Надо - уметь применять. Подумайте, какую практическую задачу вы хотели решить этой задумкой? Если такой задачи нет - не забивайте себе голову. А если желаете забить себе голову чисто для себя чем-нибудь абстрактным, то для этого лучше всего подойдет философия, а не IT.
    Ответ написан
    Комментировать
  • Как сделать Mock на приватное поле типа Dictionary для Integration tests или как можно проверить, что его метод был вызван?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Сделайте фабрику для экземпляра, реализующего кэш, и передавайте через конструктор её, в виде интерфейса. Тогда кэш у вас будет частным, действующим только внутри класса, но конкретная его реализация будет задаватьс снаружи. И все будет по фэн-шуюSOLID
    Для теста передайте в конструктор имитатор ("мок") этой фабрики, который создает и возвращаетнужный вам имитатор кэша.

    PS Стндартная для .NET имплементация кэша в памяти - это MemoryCache, он реализует интерфейс IMemoryCache. Только вот самому его имитировать нетривиально, поскольку у него есть особенность в поведении: его элемент (ICacheEntry) сохраняется в кэше по факту очистки (вызову Dispose() ). Я про это даже статью на Хабре написал.
    Ответ написан
    2 комментария
  • Как предотвратить изменение пользователем данных во время выполнения async метода сохранения этих данных?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Простейший вариант: копируйте (синхронно) в обработчике нажатия кнопки данные, которые вы сохраняете, в другое место, а там пользователь пусть хоть обизменяется: на сохраняемые данные это уже не повлияет. Если данных вдруг много, то тогда уже придется синхронизировать доступ к ним (для асинхронной синхронизации подходит SemaphoreSlim.WaitAsync/Release, а если вы можете позволить себе блокировку потока UI, то и lock сойдет). Есть и более сложные схемы - копировать только те данные, которые пользователь собрался изменить, и сохранять в таком случае именно их, а не данные из ViewModel ("копирование при записи"). Короче, дерзайте: вариантов много.
    Ну, а вариант с ползунком сам по себе ненадежен: пользователю доверять нельзя. Но как подспорье, вместе с блокировкой изменения - годится.
    Ответ написан
    Комментировать
  • Как заставить объект Moq возвращать разные значения при повторных прогонах теста?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Есть подозрение, что при каждом вызове тестового метода с новым параметром экземпляр вашего тестового класса каждый раз создается заново, вместе с новым экземпляром имитатора (Mock> _ratingRecordRepositoryMock; ) . В пользу этого говорит и то, что вы при каждом вызове заново настраиваете имитатор заново, а если бы экземпляр имитатора уже использовался, вы бы получили ошибку.

    Проверить просто: поставьте точку остановки (или воткните отладочное сообщение) в конструктор тестового класса.
    Ответ написан
    2 комментария
  • Как решить проблему с WDS?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Я не понял, что именно вы сделали, но по поводу настроек посмотрите эту статью: https://learn.microsoft.com/en-us/previous-version...
    Ответ написан
  • Почему винда создает неправильную запись в route table?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Неправильный шлюз по умолчанию прилетает вам по DHCP на следующий интерфейс: Ethernet adapter VMware Network Adapter VMnet8. Его создает VMware WorkStation, а используется он в настройках по умолчанию для выхода наружу через NAT виртуалок подсоединенных к соотвествующей сети.
    Т.к. я не знаю, для чего у вас на ПК используется VMWare (и используется ли вообще - у вас там вообще всё интересно: я вижу ещё следы VirtualBox и Hyper-V), то точно сказать, что вам надо сделать, я не могу. Но, как минимум, можно в Virtual Network Editor отключить DHCP на нем - а если у вас в этой виртуальной ести еесть виртуалки - настроить на них адрес IP вручную.
    Ответ написан
    Комментировать
  • Можно ли вручную монтировать и размонтировать диски на Windows?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Если вам нужно всего лишь монтировать вручную/не монтировать автоматически диски - смотрите в сторону команды mountvol.
    Но есть подозрение, что нужно вам, на самом деле, что-то другое.
    Ответ написан
    1 комментарий
  • Как сменить привязку DNS к старому IP?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    IP, как известно, скрываются в зоне DNS (запись типа A). Впрочем, Windows ищет КД по другим записям (SRV). Для начала: этот ваш КД указан на второй машине, как сервер DNS, причем - единственный? Если нет - укажите.
    Если уже указан - проверяйте работспособность поднятого КД - объявляет ли он себя контроллером? dcdiag (в командной строке в режиме администратора) - вам в помощь.

    PS Ещё IP может временно храниться в кэше DNS на клиенте, но если вы уже перезагружали клиент, то там его быть не может.

    PPS
    уже все перерыл
    Вы уверены, что перерыли действительно всё? В файл hosts на клиенте заглянули, например?
    Ответ написан
  • Как в C# на этапе AddCookie[options.Events.OnValidatePrincipal] проверять активность сессии пользователя в стороннем auth-server?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Подскажите, как делают refresh_token взрослые дяди в многопоточке.

    Если нужен ответ на это конкретный вопрос, причем если имеется в виду не просто многопоточка, а асинхронная, с await без блокировки потока - то на это есть такой SemaphoreSlim. Делается примерно так (надеюсь, идея будет понятна)
    //Попадаем сюда после получения существующего access token и выявления, что он просрочен
        SemaphoreSlim sem = GetSemaphore(clientId); 
       await sem.WaitAsync(); //timeot и CancellationToken добавить по вкусу
       try {
         //Получаем существующий access token повторно - вдруг его уже кто-нибудь до нас обновил 
        //   (используем double check pattern)
        //Если это не так,  выполняем тут всю логику обновления access token
      }
      finally {
          sem.Release(); //SemaphoreSlim - не мьютекс, сам не освободится в случае чего
      }


    GetSemaphore реализовать можно по-разному. Можно один на все приложение: static или Singleton - это если нагрузка небольшая.
    А можно кэшировать семафоры по одному для каждого пользователя (т.е. свой семафор для каждого clientID), чтобы пользователи не толклись около одного семафора на всех.
    Главное, чтобы этот семафор создавался с начальным значением 1 - тогда он будет пускать пользователей по одному.

    Ну, а если все делать без асинхронности, в одном потоке, блокируя его при необходимости (т.е. без await), то способов много. Простейший - блок lock вокруг кода обновления маркера доступа (access token), есть такде Monitor, Mutex, тот же Semaphore (хоть со Slim, хоть без)...
    Ответ написан
    1 комментарий
  • Не работает InterVLAN routing c3750g?

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

    Для диагностики - добавьте какой-нибудь ПК в VLAN 102 и попробуйте сначала пропинговать 192.168.101.181 с него, а потом, наоборот - этот ПК со 192.168.101.181. Если ping идет только в одну сторону, то дело 100% в брандмауэре. Если дело в бранмауэре, то надо поменять правила. Если есть домен, это легко и просто: добавляете правило в политику для ПК. Если домена нет - придется побегать и поперенастраивать на каждом вручную (можно, вообще-то под это дело скрипт написать и куда-нибудь на файл-сервер выложить).
    Ответ написан
    3 комментария
  • Как уменьшить время на удаление (30 дней) после перемещения ящика Exchange в другую базу?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вам точно нужно уменьшить именно whitespace (т.е. выпонить дефрагментацию БД), а не удалить из базы п/я, которые в ней остались в состоянии SoftDeleted (их можно увидеть командой Get-MailboxStatistics в EMS для БД, где они были)? Если нужно на самом деле удалить оставшиеся п/я (которые там по умолчанию болтаются упомянутые 30 дней), испольуйте команду Remove-StoreMailbox.

    PS Дефрагментация же БД (онлайновая) идет сама по себе своим чередом и обычно кушать не просит. Ну а автономная (offline) дефрагментация, с помощью eseutil - это вообще средство на крайний случай.
    Ответ написан
    4 комментария