Интересный, но неприятный баг в программировании | .NET? MessageBox? Yes?

Поделиться
HTML-код
  • Опубликовано: 20 авг 2022
  • Telegram: t.me/win10tweaker
    Boosty: boosty.to/xpuct
    Полный плейлист доступен по ссылке:
    • Уроки C# • Лучшие урок...
    #WindowsForms #NetFramework #Bug
  • НаукаНаука

Комментарии • 158

  • @Optem_xd
    @Optem_xd Год назад +25

    146 % нужно видео по cmd. Сам работаю разработчиком на C#, может что нового узнаю.

  • @snowbars148
    @snowbars148 Год назад +5

    Понимаю, что так себе шутка в реалиях 2к22, но все же надеюсь, что ПО для ядерного чемоданчика написано без применения .NET
    "- А вот тут, Владимир Владимирович, видите маленькое окошечко с надписями 'ДА / НЕТ' ? Вот так нажимаете кнопочку 'НЕТ' и ракеты никуда не полетят. Что, говорите, что будет если не нажимать и просто закрыть крышку? А вот давайте прямо сейчас и проверим!"

  • @dvkomsk
    @dvkomsk Год назад +1

    Спасибо за интересное видео. Рекомендую, и сам этим пользуюсь, все "странные" места в программе снабжать достаточно подробным комментарием, который объясняет, зачем этот странный код был добавлен (например, "Без этой операции приложение не закрывается при таком-то условии"). Это очень помогает, когда через продолжительное время возвращаешься к коду, видишь его как в первый раз, и может появиться соблазн провести "оптимизацию" - выбросить лишние, на первый взгляд, строчки кода.
    Самые трудные ошибки или особенности языка программирования или операционной системы, на отладку которых потрачено много времени, имеет смысл вносить в какой-то отдельный документ (хотя бы тезисно), который периодически неплохо перечитывать, чтобы не наступать на одни и те же грабли дважды.

  • @offosorg
    @offosorg Год назад +6

    Используя return внутри linq foreach мы делаем возврат из лямбда-функции (тела) foreach, отчего и не выходим глобально.
    Если же сделать return в основном коде, в данном случае в методе Form_Load, то продолжаться оно не будет.
    Интересно, что Exit не работает, да, возможно это не работает в контексте Shell. Про то, что винда сама решает нажать скрытно "да", также допускаю, что программа, получив сигнал на закрытие себя, в контексте Shell, имеет такой артефакт, что продолжает выполняться, но "более не имея права показа окон" автоматом выполняет какую-то логику.
    Не доводилось работать с Shell в программе, поэтому подробностей не знаю. Но, что в программировании хватает порой танцев с бубном, факт)
    Почему-то с самого начала, как код увидел, подумал об этом, что "оно же будет в любом случае продолжаться после отработки действия /key".
    Обычный linq foreach не "поточный", он последовательно выполняет действия, а вот если добавить уже AsParallel(), то организуется система многопоточного выполнения.
    Затем же, когда всё перенесли в обычный foreach и добавили внутри условие на существование ключа, то если ключей несколько на выходе Environment.GetCommandLineArgs(), то мы ведь для каждого аргумента, который не key, будем вызывать сценарий else.
    Более прозрачно всё таки сперва определиться, есть нужный нам ключ, или нет. Если есть, то делаем то-то, иначе то-то.
    Linq удобен, но не всегда он к месту, а "писать всю программу в одну строчку", это можно до абсурда дойти, что читать будет сложно.

    • @XpucT
      @XpucT  Год назад +2

      Молюсь, чтобы таких комментаторов, как Ты, на канале было больше 🙏

  • @besquait2882
    @besquait2882 Год назад +2

    Привет Хачатур, подскажи, пожалуйста, где я могу найти всю музыку которую ты вставляешь в видео? Я тащусь от этих лофи треков)

    • @XpucT
      @XpucT  Год назад +2

      Привет 🖐
      boosty.to/xpuct/posts/b1e7ce62-2aca-4a73-a704-023313557e42?share=post_link

    • @besquait2882
      @besquait2882 Год назад

      @@XpucT Из Украины не оплатить, обидно, деньги не конвертируются в рубли и банк блокирует перевод. Может есть возможность владельцу про версии win 10 tweaker получить эту музыку бесплатно?

  • @yamaxila
    @yamaxila Год назад +1

    А если отлавливать этот момент перед запуском цикла и записи/удаления в реестр, и вызывать, допустим, два разных метода: delete...(path) и registryUpdate()?

    • @XpucT
      @XpucT  Год назад

      Ниже в комментах предлагались разные варианты, более короткий и изящный Я предложил также в комментах.
      if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key")))
      {
      // Наш код
      return;
      }
      Однако, проблема с багом открыта. А конкретно произвольное нажатие на Да ┐('~`;)┌

  • @AllRockAndMetal
    @AllRockAndMetal Год назад +25

    Если цель видео - рассказать о баге, то лучше в названии видео указать суть проблемы, чтобы люди, которые с ней столкнутся, но совершенно не знакомы с твоим каналом, могли найти видео, решить проблему, и о тебе тоже узнать))

    • @XpucT
      @XpucT  Год назад +2

      Ты прав, поэтому в тегах всё есть.
      А название ещё нужно придумать, потому что непонятно кто виноват и что именно корявое...

    • @user-kw2hd3yv9i
      @user-kw2hd3yv9i Год назад +1

      @@XpucT добавь описание, пусть не понятное и кривое, по идее это поможет вбив в поисковике(а они и на описание реагируют) найти данное видео.

    • @XpucT
      @XpucT  Год назад

      @@user-kw2hd3yv9i есть конкретное предложение?
      Озвучивай =)

    • @user-kw2hd3yv9i
      @user-kw2hd3yv9i Год назад

      @@XpucT вот конкретного описания нету. Думаю главная проблема здесь это в универсальности .Net, т.е он должен работать на разных системах после сборки, а они один метод сделали для нескольких систем.
      А может быть такое, что ошибка с тем, что программа автоматически решает связана с message box? По идее он открывается другим потоком, так же и форч, имеем того три потока: основная программа, форч, message box, но message box в режиме show может быть только один. При нажатии кнопки OK где-то на глубинном уровне он соответствует Yes.

    • @XpucT
      @XpucT  Год назад

      @@user-kw2hd3yv9i эта проблема воспроизводится даже в JavaScript.
      Поэтому молодцы, что лайки поставили на идею, но лучше названия пока ещё нет. То есть названо пока лучше всего.
      И теги всё равно есть и ищет он по ним.

  • @KlyaniX
    @KlyaniX Год назад +9

    Тема апдейта интересна, очень хотелось бы увидеть как без дополнительных ехе это реализовать

  • @dmitrydk357
    @dmitrydk357 Год назад +2

    Привет, можно узнать если не секрет каким браузером ты пользуешься?, прост цент умер(

    • @mikhail5402
      @mikhail5402 Год назад +3

      Воскрес еще 1 августа, а 2-ого, обновился.

    • @XpucT
      @XpucT  Год назад +1

      Добро пожаловать на форум, чтобы не пропускать такие события.

  • @user-yd7or5vl9f
    @user-yd7or5vl9f Год назад

    Привет. Скажи пожалуйста, как в C# определить ratio (соотношение сторон экрана) монитор(а)?
    Чтобы итоговое ratio было как общепринятые например 2560 × 1080 это 21:9.
    Все способы что нашел в интернете даёт не верные результаты.

    • @user-kw2hd3yv9i
      @user-kw2hd3yv9i Год назад

      у меня нечто подобное было, но в WF, многие методы не работают, т.к не учитывают масштабирование в виндоус, если установлено 125% и тд, если найду проект то подскажу решение.

    • @kolyawps
      @kolyawps Год назад

      Не знаю актуально ещё или нет. Это было написано давно, возможно поможет)
      foreach (var screen in System.Windows.Forms.Screen.AllScreens)
      {
      Console.WriteLine(string.Format("{0}:{1}", screen.Bounds.Width / GCD(screen.Bounds.Width, screen.Bounds.Height), screen.Bounds.Height / GCD(screen.Bounds.Width, screen.Bounds.Height)));
      }
      int GCD(int a, int b){int Remainder;while (b != 0){Remainder = a % b;a = b;b = Remainder;}return a;}

  • @__Goodwin__
    @__Goodwin__ Год назад +2

    Мне кажется студии виднее, что ты хочешь сделать, поэтому она и удаляет ключ из реестра 🤣🤣🤣. Я думаю если результат работы вывести в лог, там будут сообщения типо : "На получи ... собачье, приложение он решил досрочно закрыть". Кстати, а если сделать остановку выполнения кода, на using, он останавливается?

    • @XpucT
      @XpucT  Год назад +1

      Нет, код всё равно пробирается и выполняет сценарий.

  • @jaba6185
    @jaba6185 Год назад +3

    Здраввствуйте! Очень ждал еще одно видео от вас! определенно что-то интерестное!!!

  • @a-vriant6816
    @a-vriant6816 Год назад +1

    f1 на Exit() и там написано "Метод Exit останавливает все выполняемые циклы сообщений во всех потоках и закрывает все окна приложения. Этот метод не обязательно принудительно завершает работу приложения."
    Видимо при закрытии через Application.Exit(); он как то закрывает все окна приложений не мгновенно и походу на дефолтные кнопки в месседжбоксах "кликает", короче чтоб такого не было, сделал так
    if (MessageBox.Show("удалить?", Text, MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
    {
    Registry.ClassesRoot.DeleteSubKeyTree(@"Directory\background\shell\Useless ARW Remover", false);
    }
    и норм работает. Как по мне это не баг, просто когда не знаешь всех тонкостей работы каких то классов, тогда и возникают такие иллюзии бага.
    Тыж сам недавно про отладчик выкладывал видео, взял бы да прошагал через Application.Exit(); и увидел что на этом код не обрывает а идёт дальше по методу. Вот он и шел дальше в твой using и открывает там диалоги (а потом exit как то видимо "нажатием дефолтных кнопок" закрывает их, не вникал глубоко), а про то что ты return пихал в foreach в расширяющих методах LINQ ниже писали в коментах, что он ток с стека расширающих методов LINQ выкидывает в тело метода void Form1_Load. Блин с моими знаниями уже наверное можно было бы где то работать в IT...

  • @qpc6
    @qpc6 Год назад +12

    Ещё 1 полезное видео)
    Было бы очень интересно узнать как работает обновление в Win10Tweaker. У меня тоже есть способ, но по мне он корявый.

    • @koriss1937
      @koriss1937 Год назад

      Обновления это да... Не иметь же файл/роут с версией на сервере и её постоянно проверять (ну или с хешем)
      Ещё замена и перезапуск приложения без отдельного батника/exe нужна

    • @hopexstudio6388
      @hopexstudio6388 Год назад +1

      @@koriss1937 Генерировать новый процесс с мозгами батника, при этом как таковой батник не создавать, профит

    • @koriss1937
      @koriss1937 Год назад +1

      @@hopexstudio6388 у меня не работало, ну попробую как-нибудь в следующий раз ещё разок, спасибо, но все равно этот способ какой-то костыльный по-моему, но наверное других вариантов и нет

  • @TobyAdd
    @TobyAdd Год назад +5

    Ура новый ролик! Спасибо Хачатур за информативное видео!

  • @coolplayerivan
    @coolplayerivan Год назад +1

    может в данном случае return не работает в generic foreach потому что туда передается стрелочная функция? то есть return привязан к ней, а не к form_load

    • @XpucT
      @XpucT  Год назад

      Так точно.

  • @RedSungamesDG
    @RedSungamesDG Год назад +1

    Чет никак не отпускает это видео. В общем мы вызвали Application.Exit() и тут же выдали messageBox с вопросом. Прервать выполнение функции Application.Exit() не может, что должно произойти дальше? И даже не это интересно, как закрыть этот месаджбокс так что бы код который ждет от него ответа сработал корректно? Мне кажется после вызова Application.Exit() будет правильным не пытаться делать что либо еще.

  • @user-su5ju8iv2e
    @user-su5ju8iv2e Год назад +7

    MessageBoxDefaultButton установите вторую кнопку (Button2) и будет возвращать "No". Нет ни какого бага тут, просто кто-то даже не знает параметры "MessageBox.Show()".
    Правильное решение использование инструкции if..else для разделения кода на две логических ветки: есть или нет аргумент "/key", потом в нужных блоках/ветках реализовывать логику.

  • @macmyem9527
    @macmyem9527 Год назад +1

    20:10 - Есть такое тоже :))))

  • @playvirtul5588
    @playvirtul5588 Год назад +1

    Спасибо за видео! Не подскажите, что за тема в студии?

    • @XpucT
      @XpucT  Год назад

      Это не просто тема, это полностью авторская переработка всего интерфейса Visual Studio, над которой Я работал 3 месяца. Тут не просто красиво, а полезно для глаз, подробнее об этом Я рассказывал в видео для спонсоров:
      ruclips.net/user/XpucTcommunity
      Тема, доп.материалы и эксклюзив становится доступным сразу, как становишься спонсором канала.
      Для пользователей из России: boosty.to/xpuct/posts/940db4d5-965d-45f4-b8e9-fbef765669b3?share=post_link

  • @SKProCH
    @SKProCH Год назад +7

    Привет, Хачатур. На самом деле все вполне логично. Когда ты на 9:14 написал return, ты выходишь не из метода Form1_Load, а из анонимного метода, который передал в ForEach.
    Application.Exit не работает хз почему, в WinForms в принципе много вещей работают не как нужно. Для гарантированного выхода из программы не нужно городить никаких костылей с вызовом cmd и прочей шушерой - достаточно вызвать Environment.Exit.

    • @kolyawps
      @kolyawps Год назад +1

      тоже сказать хотел что можно же через Environment.Exit схлопнуть программу.
      Возможно конечно там есть какие то свои нюансы о которых мы не знаем)

    • @XpucT
      @XpucT  Год назад

      Привет 🖐
      Environment.Exit не работает. Его тоже проверяли.

    • @user-is4ji8mr7j
      @user-is4ji8mr7j Год назад

      @@XpucT Я проверял сегодня лично! Все работает. Тебе нужен полный пример. Тестил в .net core

    • @XpucT
      @XpucT  Год назад

      @@user-is4ji8mr7j Я верю. Вопрос открыт по поводу самопрожатия.
      Почему-то многим захотелось докопаться до реализации. Я же специально привёл несколько прмиеров, это не важно. Важно то, что код если и пропустился, но видос бы не снял, если бы не было произвольного нажатия на Да. Весь смысл видео в этом.
      Один сидит рассказывает про то, что Я видишь ли неверно понимаю Application.ExitI(), другой говорит про return внутри ForEch.
      Ощущение, что видео мотнули где-то к концу и прослушали от момента Application.ExitI() и до первой попытки return.
      Вопрос остаётся открытым, ибо нет объяснения ни у кого, какого хера проскальзывает событие на прожатие.
      И понятно, что объяснение должно быть и записано либо WM_DESTROY state 0, как уже кто-то говорил или по другой причине, факт остаётся фактом, что такого быть не должно. То есть можно вызвать две проблемы, не зная о том, как устроен Application.Exit()
      И уж если на то пошло, совсем правильно было писать код так, как пока никто в комментах не написал, а именно:
      if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key")))
      {
      // Наш код
      return;
      }
      *ПРОФИТ*
      Но вопрос остаётся открытым....
      Мне продолжать?

  • @cherepanovav
    @cherepanovav Год назад

    А можно я спрошу?
    Я на этом - не программировал, но везде, где я 20 лет программировал, нельзя было корректно проверять на равенство Null.
    Ну никогда.
    Были всякие IsNull, IsNil, и прочие, но если увижу if x==null - сральник вспоминает всю полученную попаболь..
    Это что означает? Что разработчики инструментов настолько "пошли навстречу" джунам, что разрешили и это?

  • @ivanhurbatov4307
    @ivanhurbatov4307 Год назад +5

    Поделись пожалуйста расширениями для студии

  • @RoyZASTEROiD
    @RoyZASTEROiD Год назад +1

    можете сделать видос об "как сохранить состаяние контролов формы и если возможно данных" в файле(.ini или другой какой-то файл настройки)?

    • @XpucT
      @XpucT  Год назад

      win10tweaker.ru/forum/topic/лаунчер-который-парсит-информацию-из-in#postid-65043

  • @egolds
    @egolds Год назад +1

    Привет, Хачатур,а там случайно в аргументы не добавляется какой-то мусор при запуске?

    • @XpucT
      @XpucT  Год назад

      Привет 🖐 Нет =)

  • @i2um1
    @i2um1 Год назад +2

    Я что-то не догоняю. Ладно, легаси фреймворк в 2022. Но:
    - Любая такая проблема изначально была бы решена разделением логики приложения от представления, сразу исключились бы return и Application.Exit
    - return в конце лямбды ничего не делает
    - в любой нормальной книге не советуют использовать Application.Exit - приравнивается к говнокоду
    - ForEach не запускает код в другом потоке. Внутри метода обычный for, который вызывает делегат
    - .NET Framework и уж тем более C# к такому поведению имеет нулевое отношение, это не баг
    Советую автору видео взять любую книгу по С++ Win32 и попробовать написать простецкий message loop с выходом из цикла в callback, используя Win API. Ну или C# и p/invoke, но это без пояснений.

    • @XpucT
      @XpucT  Год назад

      Да сколько можно....
      Читай Мои ответы на такие же комменты.

    • @i2um1
      @i2um1 Год назад +2

      @@XpucT Да сколько можно...
      Не выкладывай мусор на ютуб.

  • @Ais_Hunt
    @Ais_Hunt Год назад +2

    Ох уже этот майкрософт, внутри программы всё работает более менее нормально, но как только ты хочешь как то взаимодействовать с виндой, надо юзать костыли, красивые покрытые лаком костыли. Причем удивляет то как из винды в винду мелкомягкие тащат рудименты из совсем старых операционок. Я понимаю они пытаются в обратную совместимость, но выходит это у них слабо.
    Будет видос про горячие клавиши и их сочетания? Спасибо))

    • @XpucT
      @XpucT  Год назад

      Про нажатие клавиш есть видео в плейлисте 👍
      ruclips.net/p/PL05SB3rBbUsraqiEUeS70RKhVAu97nGeb

  • @3x__
    @3x__ Год назад +1

    👍

  • @BigPandaBigRules
    @BigPandaBigRules Год назад +5

    Здравствуйте, Хачатур! Очень бы хотелось увидеть видео по способу обновления Win10Tweaker

  • @Official_Kelvin
    @Official_Kelvin Год назад

    Кто-нибудь знает как Зделать listbox прозрачным и картинку поставить?

  • @user-mopVas74
    @user-mopVas74 Год назад +1

    Привет и спасибо за урок.

  • @Shmachilin
    @Shmachilin Год назад +1

    return у Вас делет выход из лямбда-выражения что в 39 строке, а не из метода Form1_Load. Напишите нормально логику метода! Разделите логику на ту, что выполняет нужный Вам процесс по работе с файлами и логику управления реестром на отдельные процедуры. Иначе у Вас каша в коде и Вы не можете полноценно управлять потоком выполнения программы. Application.Exit() не завершает текущий метод, а лишь посылает приложению сигнал о необходимости завершения. Но при этом Главный поток приложения по прежнему продолжает выполнение метода Form1_Load дальше. Да, есть небольшой баг с вызовом диалога в этом состоянии приложения (по всей видимости), когда оно уже приготовилось закрыться, А Вы командуете ему отображать диалог ещё раз. Наведите порядок в коде, проблем меньше будет.

    • @XpucT
      @XpucT  Год назад +1

      Спасибо, Павел, за то, что уже было сказано в самом видео. Да, return в Generic работает для ForEach внутри. Спасибо, Павел, это уже сказано в видео. И да, чуть не забыл сказать, спасибо, что отметили это.
      Извиняюсь спросить, т.к. явно не достаточно опытен, в отличие от вас, но всё же, спрошу:
      У вас есть объяснение тому, по какой причине отработало событие MessageBox, если не было нажато на кнопку Да?
      Да, само собой, в коде нужно навести порядок, а то беспорядок и скорее всего это даже помешает вам сконцентрироваться на вопросе, но тем не менее.
      А если серьёзно, Паша... давай ты не будешь учить отца ебаться. Если по делу нечего сказать, доёбывай до синтаксиса там, где сказано доебаться. В этом видео сказано, что не играет роль ни стилистика, ни методы вызова, ни то, как это смогу обойти. К слову, Я так и знал, что под видео придут эксперды и прям ждал наиболее изящный выход в args. И кто бы мог подумать =) Никто не написал лучше того, что сам же Я написал в тут же в комментах.
      Вам, ребят, делать нехуй что ли, Я не пойму, ходить по видео и поправлять всех, даже тогда, *когда по-русски очень ясно и дважды было сказано* не обращать внимания на то, что не имеет отношения к коду. В самом начале даже было сказано про то, как не нужно писать код. Но нет, найдётся Павел, блять, который сейчас нахуй всех тут научит кодить и наведёт порядок...

  • @navigate001
    @navigate001 Год назад +1

    А ты не думал, что это особенность винды и работы её реестра? Возможно, системы безопасности...
    Когда у тебя пропал пункт меню, надо было нажать обновить и ещё раз посмотреть, возможно всё вернулось бы.
    А вообще, ощющение, что запись в реестре не сохраняется, а не перескакивает условие. Т.е. как в блокноте, изменения внёс, но перед выходом не сохранил результат.

    • @XpucT
      @XpucT  Год назад

      Нет, друг, всё это проверено многократно. Не нужно торкать Обновить в папке.
      Я бы не снимал это видео, не разобравшись в вопросе =)

  • @pentest1
    @pentest1 Год назад +1

    Приятно видеть новые ролики, спасибо!

  • @autodeletant270
    @autodeletant270 Год назад +1

    Давай видос про кмд

  • @dasha9574
    @dasha9574 Год назад +2

    я с# не учил, не можно ли сделать return(brake) и всё

    • @XpucT
      @XpucT  Год назад

      Нижний brake или верхний?

  • @ThugKostya
    @ThugKostya Год назад +1

    Добрый день, классное видео, очень полезное, благодарю.
    Если есть возможность, хотелось бы послушать мысли про ИИ, тема сейчас сильно популярная.
    Еще раз благодарю.

    • @XpucT
      @XpucT  Год назад

      Про ИИ обязательно будет видео.

  • @nakidivatelgavna382
    @nakidivatelgavna382 Год назад +2

    У меня одного SDA не открывает трейды ? Пишет:Trade confirmations failed to open You are missing a dependency required to view trade confirmations. Would you like to install it now?
    А С++ установлены и до этого работало, ни с чего сломалось

    • @XpucT
      @XpucT  Год назад

      Откат делал?

    • @nakidivatelgavna382
      @nakidivatelgavna382 Год назад +1

      @@XpucT Не знаю, но я скачал заново его и это не помогло. Не знал что ты знаешь про SDA

  • @user-pu1pl6ge3t
    @user-pu1pl6ge3t Год назад +2

    Чёрная магия

  • @obertin7698
    @obertin7698 Год назад +1

    здравствуйте хочу купить тему на notepad++ но не могу пополнить бусти

    • @XpucT
      @XpucT  Год назад

      Добрый день 🖐
      Можно через Telegram.
      t.me/win10tweaker/171

  • @eject37
    @eject37 Год назад +5

    Привет, очень ждал новое видео о программировании, думаю будет что-то интересное! Лайк сразу!

  • @user-is4ji8mr7j
    @user-is4ji8mr7j Год назад +1

    Есть решение. Давать или нет?

    • @XpucT
      @XpucT  Год назад +1

      Лучше того, что уже давал сам в комментах нет:
      if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key")))
      {
      // Код
      return;
      }
      Специально дал фору высказаться разрабам, но предложения были либо хуже, либо объясняют, что Application.Exit() нужно менять на Environment.Exit(0); Хотя нужно не решение, а обратить внимание, что вызовом такой комбинации кода можно словить баг. Это именно баг. Это не особенность понимания Application.Exit() или коряво продуманный синтаксис. В самом начале было сказано, что сейчас покажу, как писать не нужно. И вот каждый второй пишет Мне, что так писать не нужно. Вариантов масса, но баг - есть баг. Не нужно решение, нужно, чтобы самопрожатие кнопки Да не было. Не важно, что это было вызвано тем, что код проскочил. Важно то, что было самопрожатие кнопки Да.
      И вот прочтя всё это, удивишь Меня чем-то?
      Вперёд.

  • @quezi6735
    @quezi6735 Год назад +4

    Можно билдить консольное приложение с "Output type = Windows application" (чтобы не было окна консоли). Для mbox добавить зависимость к Winforms.
    В итоге не нужны формы вообще, да и экзешник меньше выйдет. А зачем парсить один аргумент таким странным способом? Почему не args.Contains(arg)?
    static void Main(string[] args)
    {
    if(args.Contains("/key"))
    {
    MessageBox.Show("Test");
    }
    else
    {
    //add/remove
    }
    }
    Про то, что оно само проходит проверку на if(mbox == Yes) - странно, но скорее всего связано с тем, что Application.Exit не форсит закрытие программы, а делает "gracefull" shutdown, значит какой-то код после может успеть выполниться и полагаться на моментальный выход не стоит
    Может быть после Application.Exit завершается message loop для формы и mbox просто не открывается и возвращает Yes, или создаётся(но не показывается) окно и закрывается сразу же, возвращая тот же Yes, но это всего лишь догадки.

    • @quezi6735
      @quezi6735 Год назад +2

      В ms доках написано, что после вызова Application.Exit: "A FormClosing event is raised for every form represented by the OpenForms property.". Mbox так же закрывается, что в итоге возвращает Yes (видимо оно идёт как дефолт, что странно).

    • @user-su5ju8iv2e
      @user-su5ju8iv2e Год назад

      @@quezi6735 mbox вернёт то значение, которое будет установлено по умолчанию. Т.к. в видео значение не установлено, то вернёт он первое значение.

    • @quezi6735
      @quezi6735 Год назад

      @@user-su5ju8iv2e Не понял к чему это. Как можно установить значение по умолчанию для mbox? Если вы про дефолт значение для DialogResult - то странно, почему Yes является дефолт (первым) значением

    • @user-su5ju8iv2e
      @user-su5ju8iv2e Год назад

      @@quezi6735 Вернёт то что установлено в MessageBoxDefaultButton (по умолчанию первая кнопка - Button1). Если установить Button2, будет возвращаться "No". Изначально этот параметр определяет какая кнопка по умолчанию будет выделена. У окна WinForm других значений не может быть, кроме которых определяет кодер.

  • @grigri1699
    @grigri1699 Год назад +1

    Разворачивайте в следующий раз окно на весь экран пожалуйста

  • @alivew
    @alivew Год назад +2

    Отличное видео! Жду видео о Win10Tweaker

  • @yamaxila
    @yamaxila Год назад +1

    Кстати, подобная проблема возникает и Java, если использовать parallelStream, что вызывает артефакты при отрисовке OpenGL

    • @iamdozerq
      @iamdozerq Год назад

      Хуя, а как потоки процессора связаны с шейдерами?

    • @yamaxila
      @yamaxila Год назад

      @@iamdozerq базовая отрисовка делается без использования шейдеров. Те же основые точки куба(даже с шейдерами). Если рисовать много точек сразу через parallelStream, то изображение начинает моргать и сыпаться в разных местах

    • @DenisShaver
      @DenisShaver Год назад

      @@yamaxila Точки через вершинный буфер задаёте?

    • @yamaxila
      @yamaxila Год назад

      @@DenisShaver вообще задача очень страшная... Рисовать очень много точек в кадр разных цветов(для отрисовки кривых) и open gl, я передаю массивы позиций точек, т.к. это было единственное решение, что не резало производительность до 1 фпс

    • @DenisShaver
      @DenisShaver Год назад

      @@yamaxila Я так понял, юзаете классический код OpenGL ) В OpenGL изначально рендер был однопоточным, в многопотоке может поломаться логика стейтов и дроуколов, осюда и сыпится всё. В последних версиях можно распараллелить грамотнее, но и код сложнее будет.
      А почему не пишете в шейдерах, ведь они заточены под монотонную обработку больших массивов данных?

  • @user-pu1pl6ge3t
    @user-pu1pl6ge3t Год назад +1

    Давай видео с cmd

  • @Mr.Epsilion
    @Mr.Epsilion Год назад +1

    Преклонно благодарю вас, спаситель сенсей вы наш.

  • @BlendLogDev
    @BlendLogDev Год назад +1

    А ведь есть же ещё Environment.Exit(0), тоже закрывает и выходит из приложения, но чем оно отличается от Application.Exit()?

    • @XpucT
      @XpucT  Год назад

      Не сильно отличается в нашем случае =)

  • @thurbiinahcommunity7984
    @thurbiinahcommunity7984 Год назад +1

    Хачатур ❤

  • @olmosbeksaidov2798
    @olmosbeksaidov2798 Год назад +1

    как извлечь флешки на с#

    • @XpucT
      @XpucT  Год назад

      ruclips.net/video/KYq2WF3otxc/видео.html

  • @sleepyNovember_project
    @sleepyNovember_project 5 месяцев назад

    11:10 ахахахах)))

  • @zlatik1B
    @zlatik1B Год назад +3

    Где кот?😅

    • @XpucT
      @XpucT  Год назад +1

      fНабегался, спит

    • @zlatik1B
      @zlatik1B Год назад +1

      @@XpucT Мило)

  • @ЕвгенийКурск
    @ЕвгенийКурск Год назад +1

    Спасибо за работу!

  • @arteria-circumflexa6527
    @arteria-circumflexa6527 Год назад +2

    Здравствуй! Го про обновление твикера. Ждём любые видосы.

  • @RedSungamesDG
    @RedSungamesDG Год назад +2

    Предполагаю что вот этот Application.Exit() и делает это все. Закрывает приложение и жмет кнопки, но он не выходит из функции Form1_Load, как и return в ForEach как бы и не должен. И дальнейшие действия выполняются, возможно даже эти диалоги появляются и закрываются моментально, не успев нарисоваться. А Application.Exit() должен закрыть приложение, и видимо устанавливает какие то флажки что всё - приложение уже в процессе завершения. А если приложение, что то там пытается спрашивать messageBox ами, то их тоже нужно как то закрыть, и видимо так "некрасиво" это реализовано, что бы там не выскакивало закрываем его тупо нажимая дефолтную кнопку.

  • @S3424868
    @S3424868 Год назад +2

    Да, я тоже сталкивался. В обычных листах 200+ элементов мог 1 или 2 пропустить. Два дня тогда убил что бы понять, что в этом была проблема. Так же поменял на классический цикл всё стало нормально

  • @RUSlTUZ
    @RUSlTUZ Год назад +2

    Проблема, вероятнее всего, в неправильной оптимизации под капотом, нарушившей логику и это привело к условию якобы нажатия Yes - наверняка на уровне кода ничего нигде не нажимается, просто "оптимизированное" условие теперь работает неправильно и выходит на ветку с удалением строки реестра. А оптимизация кода полюбому есть, лямбда-выражения - это не просто игрушка с удобной возможностью впихнуть логику куда-то, под капотом это весьма сложная вещь, требующая аккуратного обращения. После 17-ой минуты вариант без LINQ (т.е. без условия, заданного через лямбду) прекрасно работает, просто неправильно перебрали аргументы. Как вариант: закинуть код на SharpLab, и посмотреть что там "наоптимизируется".

  • @tonyross5178
    @tonyross5178 Год назад +1

    КМД паjojo!

  • @mux8717
    @mux8717 Год назад +1

    Спасибо за видео!

  • @Oleksandr-Nikolaev
    @Oleksandr-Nikolaev Год назад +2

    Баг может и неприятный, но ролик смотреть о нем приятно.

  • @user-bi4zw1hw2s
    @user-bi4zw1hw2s Год назад +4

    Думаю, было бы неплохо увеличить шрифт редактора, мелковат

  • @user-kw2hd3yv9i
    @user-kw2hd3yv9i Год назад +1

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

  • @Lucio11a
    @Lucio11a Год назад +1

    Немного конспирологии! :D
    Мне кажется, ForEach "цепляет" одну из скрытых функций винды для несанкционированной пользователем активации некоторых фенкций программ... Типа когда приложение спрашивает, согласны ли вы на передачу данных пользовательских, а оно жамкает "Да" без участия человека))
    т.е. это глубокозаныканный в дотНет "баг", который не баг, но на который пользователи случайно вышли :D
    Лан, это просто немного бреда)) наверняка все гораздо проще...

  • @makester1849
    @makester1849 Год назад +1

    Привет, спасибо за уроки!

  • @zetus6423
    @zetus6423 Год назад +1

    Классный ролик по программированию , сколько же ты вариантов решения перебрал в этом ролике , ужас 😁

    • @XpucT
      @XpucT  Год назад +1

      Во-во =))

  • @zxcghoul1275
    @zxcghoul1275 Год назад +1

    по командным аргументам реально полезно

  • @MysteryMarshak
    @MysteryMarshak Год назад +6

    привет.
    мне кажется, что никакой проблемы нет. каша только из-за того, что все лежит в одном методе.
    return в Linq foreach вылетает из лямбды (из конкретной итерации, остальные продолжают независимо выполняться) - аналог continue в обычном foreach, если просто.
    итоговый код:
    private void OnLoad()
    {
    var args = Environment.GetCommandLineArgs();
    if (args.Any(x => x.Equals("/key", StringComparison.OrdinalIgnoreCase)))
    {
    DeleteARWFiles();
    }
    else
    {
    UpdateContextMenu();
    }
    Application.Exit();
    }
    в UpdateContextMenu будет message box, который заблочит поток выполнения и приложение не вылетит, пока юзер не нажмет кнопку.

    • @XpucT
      @XpucT  Год назад +1

      Привет 🖐
      Как вариант - да. Но это опять же то же самое, что bool или разбирать на методы.
      Проблема-то всё равно есть и об этом нужно помнить, что каждый код нужно тщательно проверять.

  • @enderhexfyreeve1900
    @enderhexfyreeve1900 Год назад +3

    по-моему линк суют всюду и он окончательно развратил человечество, вот вам и баги лезут.

    • @DenisShaver
      @DenisShaver Год назад

      То же самое хотел написать, но ты опередил )))

  • @mozze6262
    @mozze6262 Год назад +1

    В JavaScript forEach работает также, настолько привык, что даже сперва не понял в чём суть проблемы
    😅

    • @Sheydful
      @Sheydful Год назад

      Собственно и бага в этом forEach не вижу, в JS аргумент который принимает метод forEach является отдельной функцией со своим return

  • @roma34175
    @roma34175 Год назад +2

    Очень интересно, но ничего непонятно 8)

  • @MR.G0LD
    @MR.G0LD Год назад +2

    Опасен, как всегда

  • @Ivan_sev
    @Ivan_sev Год назад +1

    Как давно я тебя ждал

  • @astrelcoff
    @astrelcoff Год назад +1

    Ты чертов Гений!

  • @altone
    @altone Год назад +2

    Очень интересно
    Но ничего не понятно

  • @55555qvazar
    @55555qvazar Год назад +1

    1:03 точняк зачем обновлять с таким то подходом

  • @pavelkazakov6347
    @pavelkazakov6347 Год назад +1

    Хачатур когда ИИ?

    • @XpucT
      @XpucT  Год назад

      Будет, Я помню =)

    • @pavelkazakov6347
      @pavelkazakov6347 Год назад

      @@XpucTСпасибо бРатело, в твоем исполнении это будет БомбА! Ждем...

  • @qrfiling3978
    @qrfiling3978 Год назад +1

    Нельзя забывать, что в массиве GetCommandLineArgs() всегда первым элементом будет путь к программе!
    То есть, args =
    {
    Путь к exe,
    /key
    }
    Это вполне может послужить причиной, в начале 17 минуты так наверняка. Но то, что он каким-то образом сам нажал на Yes в меседжбоксе - для меня остаётся вне понимания)

    • @jokeer3148
      @jokeer3148 Год назад

      Чет мне подсказывает, что при закрытии в результ код кидает фокусную кнопку по-умолчанию которая идет.

  • @Dan.398
    @Dan.398 Год назад +1

    Написал длинный коммент. Похоже, в блок попал. Глянешь?
    А так, спасибо за видос!

    • @XpucT
      @XpucT  Год назад +2

      У Меня не блокируются комменты и в папку Спам ничего уже на RUclips не летит.
      Такое случается теперь без ведома автора, поэтому чтобы избежать таких проблем следуй 3 правилам:
      1. Не ставь сам себе лайк на коммент
      2. Не пости ссылку в комменте
      3. Не дублируй своё сообщение, которое уже оставлял точь в точь на другом канале

    • @Dan.398
      @Dan.398 Год назад

      Моё решение :
      void Form1_Load(object sender, EventArgs e)
      {
      var Links = Environment.GetCommandLineArgs().Where(x => x.EndsWith("/removearw")).ToArray();
      if (Links != null && Links.Length > 0)
      {
      ProcessFiles(Links); //Глумимся над файлами
      }
      else
      {
      MakeOffer(); //Запрос на добавление записи в реестр.
      }
      Application.Exit();
      }

    • @XpucT
      @XpucT  Год назад +1

      ​@@Dan.398
      Можно ещё короче:
      if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key")))
      {
      //Глумимся над файлами
      return;
      }

    • @XpucT
      @XpucT  Год назад +1

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

    • @Dan.398
      @Dan.398 Год назад

      @@XpucT IMHO нужно вызывать Application.Exit(). А там либо дублировать, что не DRY, либо ветвление.
      Как понял из видоса, проблема в том, что состояние программы неочевидно перетекает из 1 блока в другой. Что и решается ветвлением

  • @eject37
    @eject37 Год назад +1

    А как тебе такое Илон Маск?
    i.imgur.com/hVpCf4j.png
    Application.Exit не помогает? Не проблема, теперь будем закрывать программу через паузу😅

    • @XpucT
      @XpucT  Год назад

      Тоже неплохо =))