• Как разделить UI и логику десктоп приложения C#?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    смотрите в будущее:
    - просто десктопная утилита? реализуйте по пути наименьшего сопротивления
    - есть задумки на дальнейший рост? тогда изучайте паттерны. приложение под большую нагрузку, все больше становится похожим на веб-приложение
    Ответ написан
    Комментировать
  • Как разделить UI и логику десктоп приложения C#?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Использовать стандартные паттерны типа MVC и MVVM. Для большинства приложений этого достаточно. Если приложение более сложное, то оно делится на компоненты в виде, опять же, стандартных библиотек и приложения/приложений.
    Ответ написан
    Комментировать
  • Можно ли создавать дополнительные папки в папках Views и ViewModels в Avalonia или это является плохим тонном?

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

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    В данном случае проще всего будет просто связать оба инстанса друг с другом и использовать второй инстас как резервный. Например через банальную проверку друг друга по сети запросом каким-нибудь. Один инстанс работает, а другой проверяет, что первый инстанс работает верно. Если первый инстанс не отвечает, висит, сломался и т.п. - в работу включается второй и где-нибудь ставит флаг/файл/что угодно и как, что теперь он основной, а первый - резервный будет, когда заработает и отправляет сообщение ответственному.

    Чуть более сложный вариант: использовать, например, редис для хранения состояния процесса работы и через него синхронизировать инстансы. Например: первый сервис определил для себя задачу и сообщает об этом второму, что он взял такую-то задачу или такие-то файлы. Соответственно второй сервис эти файлы не трогает. Или, оба инстанса смотрят в каталог, как только что-то обнаруживают - помещают в очередь задач. А при появлении задачи в очереди - оба сервер генерируют случайно число и так выбирают кто из них возьмет следующую задачу из очереди. Т.о. можно, этих инстансов наплодить сколько угодно.

    Более правильный вариант: разделить функционально вашу задачу на несколько более простых. А именно: вместо проверки каталога, запустить на том сервере, где находится данный каталог с файлами сервис наблюдения ФС, который использует системные уведомления об изменениях файловой системы. И при наступлении нужных событий - отправляет запрос в очередь на обработку, например в тот же редис, а оттуда запрос забирает один из инстансов и обрабатывает его.
    Ответ написан
  • Автоматическая генерация классов на основе других классов?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для C# это можно сделать 2 путями (без учета ручного создания):
    - Source Generators
    - Генерация IL кода (динамическая сборка)

    Лично я за 1 вариант, т.к. он будет быстрее в рантайме (все уже скомпилировано).
    Ответ написан
    2 комментария
  • Почему C# не кроссплатформенный?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист

    Почему C# не кроссплатформенный?

    На этот вопрос нельзя ответить сразу по двум причинам:
    1. C# - это язык, а язык не может быть кросс-платформенным, так как платформы в разрезе языка и нет.
    2. .NET уже много лет как кросс-платформенный.
    Начиная с уже мейнстримного .NET 8, заканчивая mono и всякой экзотикой типа nano framework


    но при этом, это не так

    Ничто нельзя запустить на "чём угодно"


    но в неё вопрос кроссплатформенности решена абсолютно полностью

    Если вопрос "абсолютно полностью" решён, то почему я не могу запускать программы, написанные на Java, на любом железе?
    Ответ написан
    Комментировать
  • Почему VSCode не создаёт блок Main при создании нового консольного приложения на C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это называется Top Level Main - https://metanit.com/sharp/tutorial/1.4.php (начиная с C# 9)
    Кратко - нет смысла переделывать.
    Функциональность та же самая, разница только в том, что Main() генерируется компилятором, но преимущество - можно не заморачиваться над сигнатурой (например, можно влепить async/await и не менять void на async Task)
    Ответ написан
    Комментировать
  • Почему в C# через конструктор можно передать к базовому обьекту производный?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Но это не верно с точки зрения логики,

    Почему не верно? Конкретный тип всегда можно привести к базовому.
    Джон не человек? Кошка не животное?
    Вот наоборот уже нельзя: например нельзя People ob = new object(); - будет ошибка, тк object - слишком абстрактный тип.

    PS: чтобы не мучать отвечающего - лучше делай нормальные отступы в коде.
    Ответ написан
    2 комментария
  • Как прервать поток c#?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Раньше и всегда я делал, кучу говнокода, вставлял проверки на статус токена или булевой переменной.

    Да. Ты правильно делал. Это единственный дешевый пособ остановить поток не разрушив приложение.
    Единственное но. Если это численный метод и он вычисляет
    int[a][b][c][d]=Math.Pow(a*b*c*d,Math.Sqrt(Math.Sin(Math.Cos(Math.Sqrt(a-b/a)))))))*a+b;

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

    Практика показывает что частота 10-50 Гц является оптимальной для работы с пользователем.
    И нет смысла делать чаще. Ты все равно быстрее на кнопку не нажмешь.
    Ответ написан
    Комментировать
  • Как прервать поток c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Это вообще правильно?

    Да, это правильно и это по сути единственный адекватный способ отмены долгоиграющих операций.
    Когда-то давно у потоков был метод Abort, но его удалили, тк его использование очень часто приводило к неприятным багам.
    Ну и пихать проверку cancellation token повсюду не обязательно.
    Поток вызывает 1 функцию библиотечную неуправляемого кода, как ее прервать?

    Безопасно - никак, если эта неуправляемая функция не предоставляет интерфейс для отмены.
    Даже если бы и был способ (тот же Abort), то прерывание неуправляемого кода очень вероятно приведёт к утечке ресурсов (в лучшем случае не будет освобождена динамическая память)
    Ответ написан
    Комментировать
  • Как записать данные в .docx без Interop?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    NPOI и OpenXML Sdk
    Ответ написан
    Комментировать
  • Что за ошибка cs8053?

    GavriKos
    @GavriKos
    0. Погуглить
    1. Учить сишарп
    Ответ написан
    2 комментария
  • Что за ошибка cs8053?

    @OwDafuq
    Убрать = 1; и = 100;
    Присоединюсь к GavriKos - учить C#
    Ответ написан
    Комментировать
  • Как правильно хранить изображения в SQL и как правильно работать с ними в WPF проекте?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Идеальное решение без лишних рассуждений

    Картинки - в S3, а перед S3 поставить CDN, чтобы сильно S3 не нагружать.
    В центральную базу данных на сервере - только идентификаторы картинок.

    Клиент (на WPF) будет обращаться к какому-то приложению, которое написано на ASP NET Core, а оно, в свою очередь, будет идти в центральную БД за всякой инфой.

    Опционально - клиент будет идти в CDN за картинками.
    Сами картинки потом пусть кэшируются в ФС, чтобы не нужно было идти за ними повторно.
    Данные о модах тоже можно кэшировать, но уже в sqlite - это полезно будет, пока нет интернета, или пока актуальный список модов загружается.



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

    Главный минус картинок в ФС - это то что они будут привязаны к одному серверу. Лучше хранить картинки в другой системе (S3 или CDN) и хранить в базе их идентификаторы, чтобы потом клиент мог сам их скачать, если это необходимо. Так раздача картинок не будет привязана к основному серверу.

    А клиент пусть их кэширует также у себя на диске.

    В будущем я хотел бы попробовать сделать так, чтобы база была на каком-то сервере, чтобы многие могли пользоваться приложением, но не думаю, что это будет нормально работать, да и вообще не красиво( Заранее спасибо.

    Если ты хочешь, чтобы разные пользователи имели доступ к единой базе модов, то действительно надо сделать какой-то сервер.

    Ну и клиент на WPF не должен напрямую подключаться к MS SQL.
    MS SQL должен находится где-то на сервере и спрятан за каким-то другим web-сервером (который будет написан с использованием ASP NET Core например), который будет уже отвечать за всякую логику.
    Если тебе нужна локальная база данных на клиенте (для кэша например), то лучше использовать sqlite.
    Ответ написан
    2 комментария
  • От чего появляеться исключение System.IO.IOException: "The process cannot access the file '37.txt' because it is being used by another process."?

    Adler_lug
    @Adler_lug
    File.Create возвращает FileStream, т.е. он и держит файл открытым
    Ответ написан
    Комментировать
  • Как правильно и удобно читать данные из БД?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. async-await используй
    2. Используй какую-нибудь orm-ку (EF core, Dapper, linq2db). Многие из них как правило явно запрещают параллельные запросы в рамках одной транзакции.

    Но вроде чисто в теории sqlite разрешает конкурентное чтение (но не запись)
    Ответ написан
    Комментировать
  • Как получить текст из автоматически сгенерированных TextBox-ов?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Документация -> Learn / .NET / Обозреватель API / System.Windows.Controls / Grid -> Свойства -> Children: https://learn.microsoft.com/ru-ru/dotnet/api/syste...
    Ответ написан
    4 комментария
  • Почему CLR при генерации Машиного кода не оптимизирует циклы?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист

    еще заметил циклы не разматываются

    С чего взял? Вроде в core 3.1 добавили разматывание циклов.
    Но циклы разматываются очень редко, тк можно стек порвать

    Рекомендую посмотреть доклад от Егора Богатова: https://m.youtube.com/watch?v=H1ksFnLjLoY и статьи от него. Сейчас он работает в ms и как раз занимается jit-ом.

    Ещё можно задать какие-нибудь вопросы напрямую в чате https://t.me/pro_net
    Ответ написан
    Комментировать
  • Как можно инициализировать структуру в прямо в массиве в safe коде c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист

    То есть происходит лишние выделение на стеке память.

    Это на столько мизерное выделение, что я даже хз.

    Вообще структуры в массиве изначально уже созданы, но проинициализированы нулями - ты можешь сразу начать вызывать какие-то методы у них (которые, например, проинициализируют их)
    Ответ написан
    Комментировать
  • Где можно посмотреть реализацию готовых и профессиональных WebAPI в связке с клиентом?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Microsoft создал референсный микросервисный проект - eShopOnContainers. Там есть основные паттерны проектирования, клиенты различные (ajax, mvc).

    А вообще, это только часть общего репозитория с проектами под различные кейсы - dotnet-architecture

    Если есть время, то можно и книгу прочитать по этой архитектуре
    Ответ написан
    Комментировать