• Почему служба Windows с Timer отрабатывает только один раз?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Скорее всего проблема с GC.
    Ты создаешь локальную переменную таймера и никуда не сохраняешь. В результате, по окончании OnStart на эту переменную никто не указывает и в результате ее собирает GC. Дополнительно метод Count - статический, т.е. ссылки на текущий объект Service1 тоже не сохраняется.
    Попробуй 2 вещи:
    - Сделать Count не статическим (но след. вариант лучше)
    - Хранить этот таймер в поле (инициализируешь в OnStart). Дополнительно в этой случае стоит останавливать этот таймер в OnStop
    Ответ написан
    2 комментария
  • Как правильно работать с форматом HL7 в рамках .NET?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Я тоже не работал с HL7, но если просуммировать что нашел, то:
    - HL7 - Health Level 7
    - Это прикладной протокол (протокол приложений), как 7 уровень OSI. Описывает данные для приложения. Как например, HTTP - текстовый и ничего про TCP
    - Т.к. это стандарт, то есть множество реализаций (Version 2, Version 3, CDA, CDD и другие)
    - Предназначен для работы с медицинскими документами (электронный документооборот)

    Без этих всяких GPT нашел библиотеки:
    - clear-hl7-net - реализация Version 2.0 лежит на гитхабе для netstandard2.1 и net7.0
    - целая статья на хабре, в которой гора этих реализация

    Лично от меня: я бы не советовал браться за этот заказ - слишком велики риски и ответственность высокая (тут жизнь людей)
    Ответ написан
    2 комментария
  • Что делать если происходит такая ошибка?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Эта ошибка означает, что в поле хранится null, т.е. оно не инициализировано.
    Посмотри на поля text и tet2 - ты в методе Start их не инициализируешь, поэтому они остаются null
    Ответ написан
    2 комментария
  • Можно ли создавать дополнительные папки в папках Views и ViewModels в Avalonia или это является плохим тонном?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Можно. Разрешаю
    Ответ написан
    Комментировать
  • Как в С можно сделать реагирование на клавишу клавиатуры без ожидания обязательного ввода (без использования стандартных библиотек)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Можно запустить фоновый поток: он читает ввод и при получении Q/q выставляет флаг окончания.
    Псеводкод:

    int should_stop = 0;
    
    void keyboard_processor() {
         while (should_stop != 1) {
               char input = get_input();
               if (input == 'q' || input == 'Q') {
                      should_stop = 1;
                      break;
               }
         }
    }
    int main() {
        start_thread(keyboard_processor);
        while (should_stop != 1) {
              do_work();
        }
    }
    Ответ написан
  • Зачем нужен Service Locator?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Случаев использования много. В некоторых без него не обойтись.
    Например:
    - Зависимость необязательна
    - Есть множество реализаций, а не 1
    - Отложенное создание

    Если не хочешь использовать - не используй
    Ответ написан
    1 комментарий
  • Как в Git в организовано хранение файлов?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    1. Гит в истории целые файлы, уже измененные, но сжатые (изменения хранит SVN, но у него другая модель работы)
    2. Сравнение файлов происходит через сравнение хэша файла. История изменений хранится в виде графа, поэтому переключение - это по сути: 1. Найти общего предка 2. Откатиться до этого предка 3. Применить изменения до новой ветки. Дополнительно, если у тебя есть незакоммиченные текущие изменения, то гит тебе об этом скажет
    3. Скачивается вся история изменений из удаленного репозитория и потом HEAD выставляется на ветку, которую клонировал (в основном это main/master)

    Почитай как работает git

    UPD: спасибо Saboteur за важное замечание
    Ответ написан
    1 комментарий
  • Как сделать интерактивный иней на стекле?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ответ написан
    Комментировать
  • Как передать динамический текст в switch-case?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    switch (path)
    {
        case not null when string.Equals($"{context.Culture}/some-page", path):
            break;
    }
    Ответ написан
    Комментировать
  • Стотит ли менять asp.net mvc на asp.net web api + nextjs?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    нормально себя чувствует.

    Работает и не трогай
    Ответ написан
    3 комментария
  • Как отсортировать вложенные друг в друга объекты?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    В голову приходит схема сортировки тройки (id родителя; id потомка; название):
    - id родителя - id узла-родителя, может быть null
    - id потомка - id любого узла-потомка, может быть null
    - название - это поле Name (скорее всего сортировка по нему нужна)

    И тогда сравнение будет по соответствующим элементам тройки.
    Причем, id родителя и id потомка могут быть null и в таком случае сравнение будет null first (т.е. null больше) и null last (т.е. null меньше) для id родителя и id потомка соответственно. А если равны, то уже по имени (Name) сравниваем.
    Вроде бы условия соблюдаются:
    - Без родителя первый: id родителя = null - больший вес при сравнении
    - Самый последний - объект без дочерних элементов: id потомка = null - больший вес при сравнении
    - Дальше по убыванию к дочерним: id - можно как числа сравнивать

    P.S. "дальше по убыванию, к дочерним" не совсем понял, что имеется ввиду
    Ответ написан
    Комментировать
  • Как правильно возвращать значение из геттера?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Полностью зависит от контекста. Здесь нет правильного ответа.
    Можно выделить 2 случая:
    1. Код полностью твой
    2. Код будут использовать другие пользователи

    Если случай 1, то делай как хочешь. Здесь ты главный и знаешь что менять можно, а что нет
    Если случай 2, то тут уже зависит:
    - Если возвращаешь объект, который может (и должен) быть изменен - делай изменяемым
    - Если это слепок состояния - то можно подумать над неизменяемым состоянием
    - Можно прописать это (то что нельзя изменять объект) в документации к методу геттера

    Дополнительно, если тебе так уж нужна неизменяемость, то добавляй интерфейсы. Возвращай какой-нибудь интерфейс с одними геттерами.
    Ответ написан
    Комментировать
  • В чём отличие между middleware и фильтрами в .Net?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Middleware - это часть ASP.NET Core. Они занимаются обработкой HTTP запроса, могут его изменять/дополнять. Например, производить авторизацию или, если запрос пришел от прокси, то разворачивать отображать HTTP заголовки
    Фильтры - это часть MVC, фреймворка внутри ASP.NET Core. Т.е. они часть контроллеров и предназначаются только для них, но могут работать и как Middleware (HttpContext поле доступно). Дополнительно, у них есть иерархия вызовов, в зависимости от типа фильтра, а middleware вызываются каждая и в зависимости от порядка их регистрации
    Ответ написан
    2 комментария
  • Где можно посмотреть официальную статистику популярности операционных систем Linux?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ответ написан
    Комментировать
  • Как получить Text из созданного через код элемента Textbox в WPF C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Эти TextBox как-то появляются. Причем они появляются динамически, т.е. создаются из кода.
    Поэтому когда создаешь новые TextBox, то сохраняй их в какое-нибудь поле (например, List<TextBox>) и работай с ними через это поле.
    Ответ написан
    3 комментария
  • Как связать grpc message з MediatR?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Почему не сделать отдельный IRequest, у которого единственное поле - этот массив байтов модели?
    Либо при получении этого массива делай его парсинг и создавай отдельный, готовый класс модели IRequest
    Ответ написан
  • В чем отличия jetbrains dotTrace и clrstack?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    dotTrace - полноценная утилита для профилирования приложений, нахождения горячих точек. В общем платный и удобный инструмент. Можно сказать, что это полноценная "IDE" для профилирования, которая может подсказать проблемы
    clrstack - это уже консольная утилита, для визуализации уже снятого дампа стека (дамп снять можно через dotnet dump). Тут работа через консоль (менее наглядно, возможно чем через GUI на dotTrace), но бесплатно. В сравнении с dotTrace, это уже просто небольшая тулза, которая облегчит профилирование, но всякие выводы должен делать уже сам (нет подсказок каких-то)

    UPD: clrstack вроде как только для windows судя по исходникам
    Ответ написан
    4 комментария
  • Почему 0,5 округляется до чётного числа?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Округляет до четного, потому что так написано в документации к функции:

    The integer nearest a. If the fractional component of a is halfway between two integers, one of which is even and the other odd, then the even number is returned. Note that this method returns a Double instead of an integral type.


    Если нужное другое округление, то есть перегрузки:
    Math.Round(4.5, MidpointRounding.ToEven);
    Math.Round(4.5, MidpointRounding.ToZero);
    Math.Round(4.5, MidpointRounding.AwayFromZero);
    Math.Round(4.5, MidpointRounding.ToNegativeInfinity);
    Math.Round(4.5, MidpointRounding.ToPositiveInfinity);
    Ответ написан
    2 комментария
  • Хорошая ли идея создавать БД на стороне клиентской части (фронтенда)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Зависит от многих факторов:
    1. Если это полноценное офлайн приложение:
    - Если необходима полноценная СУБД (SQL Server, Postgres, MySql) - то нет. Мало кто захочет дополнительно себе устанавливать такие тяжелые зависимости, они всегда могут ее удалить и тогда уже не восстановить, обновления ПО либо не будут возможны, либо трудны
    - Если это встраиваемая СУБД (SQLite) - то вполне да, так многие приложения делают (на андроиде слышал SQLite часто используют)
    2. Если это онлайн приложение в браузере:
    - localStorage - это key/value хранилище
    - web sql - устаревшая технология
    - куки - могут пропасть в любое время
    3. Если это корпоративные клиенты, то можно навязать им свои требования по необходимости запуска СУБД на каждой машине

    Тут все зависит от того, что под БД подразумевается и для каких целей это нужно

    UPD: SQL запросы из клиента напрямую в БД - очень плохая идея, не надо так (обновления, безопасность, гибкость и т.д. - все постарадает)
    Ответ написан
    4 комментария
  • Cannot convert return expression of type, C# generic method, как вернуть конкретный тип?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    как можно вернуть конкретный тип значения без изменения сигнатуры?

    В данном случае - никак.
    T - это generic параметр для подстановки во время компиляции. Он означает конкретный тип.
    Так как никаких ограничений на него не выставлено, то считается, что может в него быть вставлено абсолютно что-угодно. Но возвращаемые значения должны уметь конвертироваться в этот возвращаемый тип, например, если T - long, то ParseInt сработает, т.к. int конвертируется к long (неявно и явно), а DateTime к long просто так нет. А теперь вместо T подставь byte или какой-нибудь класс и подумай - можно ли int к этому классу сконвертировать.

    Пишу парсер

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

    Дополнительно, в данном случае лучше применять какую-нидудь фабрику этих парсеров, т.к. в рантайме через рефлексию определять свой тип и на основании него парсить - такое себе.

    Например, так можно

    enum TokenType
    {
        Int,
        Decimal,
        DateTime,
    }
    
    public abstract class ParseResult
    {
          public abstract TokenType Type { get; }
    }
    
    public class IntParseResult: ParseResult
    {
           public override TokenType Type => TokenType.Int;
           public int Value { get; }
           IntParseResult(int value)
           {
                 Value = value;
            }
    }
    
    public class DecimalParseResult: ParseResult
    {
           public override TokenType Type => TokenType.Decimal;
           public decimal Value { get; }
           DecimalParseResult(decimal value)
           {
                 Value = value;
            }
    }
    
    public class DateTimeParseResult: ParseResult
    {
           public override TokenType Type => TokenType.DateTime;
           public DateTime Value { get; }
           DateTimeParseResult(DateTime value)
           {
                 Value = value;
            }
    }
    
    public interface IParser
    {
              ParseResult Parse(string str);
    }
    
    public class IntParser: IParser
    {
            public ParseResult Parse(string str) => ParseInt(str);
    }
    
    public class DecimalParser: IParser
    {
            public ParseResult Parse(string str) => ParseDecimal(str);
    }
    
    public class DateTimeParser: IParser
    {
            public ParseResult Parse(string str) => ParseDateTime(str);
    }
    
    public static class MyParser
       {
           private static IParser GetParserFor(string str) { /* .... */ };
           public static ParseResult Parse(string str)
           {
                  var parser = GetParserFor(str);
                  return parser.Parse(str);
           }
       }


    Я рекомендую убрать этот статический парсер и вынести решение о том какой парсер использовать выше по иерархии вызовов, либо пересмотреть логику парсинга, т.к. просто посмотреть на строку и понять как парсить - не самое эффективное решение.
    Ответ написан
    Комментировать