• Какие существуют альтернативы .Net технологий?

    @Sterk
    Программист
    Да даже в .net стеке тоже самое можно решить другими методами.
    • WinForms - WPF
    • WinService - self-hosted Web Server или просто Web решение для IIS, не понятно что предполагается под "выполняет различные фоновые операции"
    • WCF - WebApi, NancyFx
    • EF - dapper, NPoco, linq2db, nhibernate
    Ответ написан
    Комментировать
  • Какой язык выбрать под Backend высоконагруженного rest-сервиса?

    @Sterk
    Программист
    Голос за C#. Да он не такой быстрый как C++. Но он довольно быстр. Если вы собираетесь выпустить новую версию к лету или позднее можно присмотреться к новому asp.net core mvc. на гитхабе есть бенчмарки(только не смотрите на asp.net mvc 5 он уныл в этом плане). Внизу страницы есть "Plain Text with HTTP Pipelining", как мне кажется очень показательный. Да пока что линукс проседает(при этом все равно оставаясь быстре node.js, который быстрее php), но это дело времени. По поводу того что скала пока что быстрее, два месяца назад asp.net core выдавал в этих тестах 200-300к(на windows). На будущее(год-два) майкрософт пилит компиляцию в нативный код на разных платформах(пока что это работает только на HelloWorld).
    Ответ написан
    Комментировать
  • Как можно через raw ado в vnext подключится к mysql серверу?

    @Sterk
    Программист
    В данный момент нет официального порта mysql коннектора для coreclr. Вы можете попробовать собирать под полноценный .net framework или под моно. При этом подключить обычный mysql коннектор. Либо попробовать postgresql
    Ответ написан
  • Какие плюсы и минусы у различных подходов в работе с диалоговыми окнами в WPF MVVM?

    @Sterk
    Программист
    С чего вы взяли что это подходы для работы с диалогами?
    Messenger - паттерн для передачи сообщений(событий) из одной вью модели в другую.
    Service Dialog - сервис который создает разные диалоговые окна?
    Dependency Injection - одна из реализаций принципа Inversion of Control (инверсия управления). Например вашей MainViewModel надо использовать Messenger и ServiceDialog. Тогда вы делаете инъекцию зависимостей, например, через конструктор.
    public MainViewModel(Messenger messenger, ServiceDialog serviceDialog){...}

    IoC-контейнер подставит зависимости сам.
    Так я определяю сказанные вами понятия. Теперь вопрос - что мешает использовать это все вместе?
    Ответ написан
    3 комментария
  • [C#, WPF] Как сделать подобный выплывающий список?

    @Sterk
    Программист
    Если я правильно понял то на скриншоте изображено дерево, тогда используйте TreeView(первый пример из гугла)
    Если же вам надо просто одноранговый список у элементов которого можно развернуть доп панель с информацией, то я предложил бы использовать ListView. Сделать подобный шаблон элемента:
    ----------------------
    |  (+)  Заголовок     |
    ----------------------
    |    Скрываемая       |
    |     Панелька        |
    |     С инфой         |
    ----------------------

    У панели сделать биндинг на свойство IsVisible и играть им по нажатию на кнопку - (+).
    Ответ написан
    Комментировать
  • Как открыть и масштабировать изображение BitmapImage?

    @Sterk
    Программист
    у BitmapImage есть DecodePixelWidth, DecodePixelHeight размер для конвертации.
    var uri = value as string;
                if (string.IsNullOrWhiteSpace(uri))
                    return null;
                var image = new BitmapImage();
                image.BeginInit();
                image.UriSource = new Uri(uri);
                if (Width != null)
                    image.DecodePixelWidth = (int)Width;
                if (Height != null)
                    image.DecodePixelHeight = (int)Height;
                image.EndInit();
                return image;

    Либо можно задавать размер контролу, а не источнику, мне кажется это ваш случай.
    var uri = value as string;
                if (string.IsNullOrWhiteSpace(uri))
                    return null;
                var source = new BitmapImage(new Uri(uri));
                var image = new Image { Source = source };
                if (Width != null)
                    image.Width = (int)Width;
                if (Height != null)
                    image.Height = (int)Height;
                return image;

    Делаете обработку клика и меняете размер у контрола.
    Ответ написан
    Комментировать
  • Как организовать взаимодействие основной программы и GUI?

    @Sterk
    Программист
    Я бы посоветовал вам узнать про dependency injection. С использованием его все становится гораздо проще.
    Приведу пример организации проекта:
    1 Модуль описание интерфейсов для работы
    interface ICore {...}
    interface IDeviceManager {...}

    у этого модуля не должно быть зависимостей
    я думаю в нем же можно объявить структуры данных, но у них так же не должны быть зависимостей от других модулей программы
    2 Модуль ядро - в нем должна быть реализована вся логика работы с приборами(или еще чем то) как сервис
    class Core : ICore {...}
    class DeviceManager : IDeviceManager{...}

    этот модуль в зависимостях должен иметь только модуль 1
    он должен быть автономным - работать в потоках
    3 Модуль Gui - здесь есть варианты, но объединяет их одно - использование шаблона проектирование "внедрение зависимостей". Вот сравнение контейнеров. Я использую LightInject он быстр и прост.
    Метод запуска окошек с контейнером на примере LightInject.
    допустим у вас есть главное окно и окно с приборами
    public partial class MyMainForm
    {
        private LightInject.IServiceContainer _container;
        public MyMainForm(LightInject.IServiceContainer container)
        {
            _container = container;
        }
        public void ShowDeviceWindow()
        {
             var form = _container.Create<MyDeviceForm>();
             form.Show();
        }
    }
    public partial class MyDeviceForm
    {
        private IDeviceManager _deviceManager;
        public MyDeviceForm(IDeviceManager devicemanager)
        {
            _deviceManager = devicemanager;
        }
        public void ButtonClick()
        {
         // Здесь вы делаете все что хотите и работаете с менеджером
        // Например загружаете список приборов в лист
        foreach(var device in _deviceManager.GetDevices())
            listBox.Add(device.ToString());
        }

    для того что бы не создавать все объекты и зависимости окнам руками используем контейнер
    если вы используете WinForms то скорее всего это надо прописать в programm.cs
    var container = new LightInject.ServiceContainer();
    container.RegisterInstance<IServiceContainer>(container);
    container.Register<ICore, Core>(new PerContainerLifetime());
    container.Register<IDeviceManager, DeviceManager>(new PerContainerLifetime());
    var form = container.Create<MyMainForm>();
    //Не помню как выводятся окна в WinForms
    //Но логика надеюсь понятна
    form.Show();

    Таким образом у нас любое окно может запросить любой нужный ему интерфейс для работы с ядром\логикой.
    Что бы в каждое окно не совать IServiceContainer я бы создал IWindowManager в реализации которой получал бы контейнер и выводил окно что то вроде manager.ShowWindow<MyDeviceForm>(); и всем окнам подсовывал бы его. Так проще контролировать создание окон.
    Для WPF я бы мог посоветовать глянуть различным MVVM фрейворки Calibrun.Micro, Catel и тд.
    Есть даже модульная система выглядящая как IDE gemini
    Не знаю чем обусловлен выбор WinForms, но для него тоже есть фреймворки, но вроде бы в них применяется шаблон MVP.
    Для своих нужд я написал клон gemini со своим видением некоторых моментов. Надеюсь это поможет в разделение логики и окон, несколько лет назад я так же искал информацию как же вообще строить окна, но подсказать было некому.

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

    @Sterk
    Программист
    вот самое простое решение

    var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    PrintList(list);
    bool delete = false;
    while (list.Count > 1)
    {
        for (int i = 0; i < list.Count; i++)
        {
            if (delete) list.RemoveAt(i--);
            delete = !delete;
        }
        PrintList(list);
    }
    Console.Read();

    функция печати
    static void PrintList(IEnumerable<int> list)
    {
        foreach (var item in list)
            Console.Write("{0} ", item);
        Console.WriteLine();
    }
    Ответ написан
    Комментировать
  • Какова производительность yii2 и laravel?

    @Sterk Автор вопроса
    Программист
    Отвечу на свою проблему. Может быть кому то пригодится.
    Поставил в VirtualBox Ubuntu Server. Выдал ему 1 ядро моего i7 и 1 гигабайт оперативной памяти.
    Сервер спокойно выдерживает 40 и более запросов в секунду(больше не смог сделать потому что не смог настроить апач на стабильную работу, каждый секунд 30 вылазил пик задержки и график времени отдачи сбивался, что мешало наблюдению). В результате пары дней тестирования пришел к выводу, что yii2 несет меньше накладных расходов.
    При 40 запросах yii2 для своего шаблона basic выдает страничку за 7.5-10 миллисекунд(загрузка процессора скачет в пределах 20-30%). Пустой Laravel проект с HomeController и 1 вьшкой выдает страничку за 10-15 миллисекунд(загрузка процессора скачет в пределах 30-40%). При этом даже при настроенных(на неиспользование hdd - apc driver) кеширование и сессиях есть использование hdd, что в случае с Linux сервером на SD карте вызывает проблемы.
    Lavarel требует в 1.5-2 раза больше времени на выполнение самого простого сценария - запроса 1 метода с возвратом простейшей вьюшки.

    Полученная статистика скорее всего совершенно не важна для обычных серверов, но в моем случае говорит не в пользу Laravel.
    Ответ написан
    3 комментария