Ответы пользователя по тегу C#
  • Как на udp сервере подсчитать one-way latency и верменной offset клиента?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    То что причина в часах понятна. Я вижу тут несколько решений:
    1. Синхронизация часов клиента. Возможно какой-нибудь NTP поможет (не работал с ним). Но синхронизировать надо только клиента, т.к. если сервер затронет, то и других клиентов тоже
    2. Использовать глобальный синхронизатор (время по gps синхронизировать)
    3. Делать бенчмарки + вычисления

    Насчет 3 -
    1. Предполагаем, что в обе стороны время одинаковое
    2. Делаем несколько замеров (например, можно каждые 100 пакетов)
    3. Рассчитываем время как avg / 2 , где avg - это среднее время отправки в обе стороны
    Ответ написан
    Комментировать
  • Между сборками и пространствами имён нет прямого соответствия. Что это значит?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Ты можешь создать сборку (грубо говоря, проект/.csproj), которая называется Service.Domain, но все классы там будут в неймспейсе (пр-ве имен) Another.Namespace
    Т.е. название проекта не накладывает ограничений на названия пр-в имен, которые в нем хранятся.
    Ответ написан
    Комментировать
  • Почему client gRPC не подключается к service gRPC?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Скорее всего проблема с версией HTTP. На сервере открой порт для gRPC и пропиши в нем HTTP/2 использование.

    appsettings.json

    "Kestrel": {
        "Endpoints": {
          "gRPC": {
            "Url": "http://localhost:5000"
            "Protocols": "Http2"
          }
        }
      }
    Ответ написан
  • Почему получается подключить Core в Dockerfile?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Проверь контекст из которого запускаешь docker build. Ошибка не связана с Libs - все падает еще на этапе копирования первого проекта

    P.S. это последний аргумент (обычно . ставят), например docker build -t sample-image:latest .или
    docker build -t sample-image:latest source-directory
    Ответ написан
    2 комментария
  • Как транслировать аудио в микрофон, py, c#, c++?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Не совсем понял, что ты хочешь. Возможно, создать виртуальный микрофон и дальше использовать именно его - https://codeease.net/programming/python/virtual-mi...
    Ответ написан
    1 комментарий
  • Как решить проблему database is locked?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Скорее всего проблема здесь:
    SQLiteDataReader reader = command.ExecuteReader();

    Ты его не закрываешь и в результате соединение висит.
    Подсказка: от реализует интерфейс IDisposable
    Ответ написан
  • Как обеспечить относительный путь к БД SQLite?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Скорее всего рабочая директория другая - не директория с исходным кодом. Т.к. запуск производится где-то из bin/Debug/net8.0/..., а там этой БД и нет.
    Тут 2 решения:
    1. Прописывай относительный путь с учетом папки: ../../../database/Keys.db
    2. Прописывай абсолютный путь

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

    P.S. путь для 1 кейса не факт что правильный - поиграйся с путями
    Ответ написан
    3 комментария
  • Что означает оператор => в linq c#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это называется лямбда функция - https://metanit.com/sharp/tutorial/3.16.php
    Ответ написан
  • Как можно реализовать ограничение на одновременное скачивание файлов?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Проблема с методом File - он возвращает ленивый ответ. Т.е. он не читает весь поток сразу, а ждет пока будет вызван метод от IActionResult, поэтому семафор берется и сразу же отпускается.
    Чтобы эту проблему решить надо знать, когда файл точно отправлен.
    Предлагаю сделать декоратор специальный. Например:

    [ApiController]
    [Route("[controller]")]
    public class SampleController : ControllerBase
    {
        private readonly IRateLimiter _rateLimiter;
    
        public SampleController(IRateLimiter rateLimiter)
        {
            _rateLimiter = rateLimiter;
        }
    
        [HttpGet("connection")]
        public async Task<IActionResult> DownLoadFile(Guid file)
        {
            var stream = await GetFileStream(file);
            return new RateLimiterFileActionResult(File(stream, "content/type", "sample.txt"), _rateLimiter);
        }
    }
    
    class RateLimiterFileActionResult : IActionResult
    {
        private readonly IActionResult _actionResultImplementation;
        private readonly IRateLimiter _rateLimiter;
    
        public RateLimiterFileActionResult(IActionResult actionResultImplementation, IRateLimiter rateLimiter)
        {
            _actionResultImplementation = actionResultImplementation;
            _rateLimiter = rateLimiter;
        }
    
        public async Task ExecuteResultAsync(ActionContext context)
        {
            try
            {
                await _rateLimiter.ObtainAsync(context.HttpContext.RequestAborted);
                await _actionResultImplementation.ExecuteResultAsync(context);
            }
            finally
            {
                await _rateLimiter.ReleaseAsync(context.HttpContext.RequestAborted);
            }
        }
    }
    
    public interface IRateLimiter
    {
        public Task ObtainAsync(CancellationToken token);
        public Task ReleaseAsync(CancellationToken token);
    }


    Здесь используется не семафор, а специальный интерфейс, хотя разницы особо нет.
    Также, стоит заметить, что блокировка берется внутри метода декоратора, а не в методе контроллера - например, пользователь отменит запрос и тогда надо будет думать как семафор отпустить - в этой реализации думать не надо.
    Ответ написан
    1 комментарий
  • Как сделать статические переменные видимыми в инспекторе в Unity?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это сделать нельзя.
    Для обхода - создай прокси поле объекта и через него обновляй состояние статической переменной
    Ответ написан
    2 комментария
  • Как вывести формулу в TextBox?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Посмотри список тут - https://stackoverflow.com/a/9071856
    Ответ написан
    Комментировать
  • Почему служба 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#
    Просто хочу быть счастливым
    Можно. Разрешаю
    Ответ написан
    Комментировать
  • Как передать динамический текст в switch-case?

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

    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. "дальше по убыванию, к дочерним" не совсем понял, что имеется ввиду
    Ответ написан
    Комментировать
  • В чём отличие между middleware и фильтрами в .Net?

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

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

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