• При многопоточной работе исключена вероятность одновременнего доступа к ресурсам?

    @Meloman19
    Ты не совсем понял проблему многопоточности. Да, чтение неизменяемого значения из множества потоков безопасно, но вот изменение - нет.

    На примере:
    Лежит в памяти значение x = 1. Пока его только читают, всё ок, но предположим, что это у нас какой-то счётчик и два потока хотят его увеличивать на 1.

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

    Списки, к примеру, внутри хранят тот же счётчик для количества элементов, поэтому одновременная запись может неправильно отработать.
    Ответ написан
    3 комментария
  • Property и Fields?

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

    В этих самых геттерах и сеттерах ты можешь работать с полями, как и в любом другом методе класса.

    Автосвойство - это лишь упрощение, если требуется свойство, в котором кроме установки значения одного поля, иной логики нет. В закулисье автосвойство просто само по себе создаёт поле и два (или один) метод, который возвращает значение этого поля (или устанавливает).

    Что касается памяти: поле занимает место в памяти и для каждого экземпляра своё место. Геттеры и сеттеры свойства, как и обыкновенные методы - только один раз в памяти.
    Ответ написан
    Комментировать
  • C#. Как изменить разрешение экрана?

    @Meloman19
    Стандартного способа, встроенного в стандартные библиотеки, насколько я знаю - нет.

    Всё через PInvoke и WinAPI.
    Рабочий пример можно посмотреть тут.
    Ответ написан
    Комментировать
  • Как правильно реализовать "сложную" привязку данных в wpf?

    @Meloman19
    Ну у вас тут сразу же 2 ошибки.

    Первая, DataContext в StackPanel таким образом вы выставить не сможете, потому что у самого окна DataContext пустой. У вас вообще View нигде не пересекается с ViewModel. Хотя как минимум одна точка пересечения быть должна. Обычно это делают в App.xaml.
    Открываете App.xaml и удаляете StartupUri. Там же вбиваете Startup и добавляете на это событие обработчик в коде.
    private void Application_Startup(object sender, StartupEventArgs e)
    {
       MainWindow = new MainWindow
       {
          DataContext = new Service
          {
             Id = 0,
             Info = new InfoService
             {
                Id = 1,
                Main = new ServiceMain { Id = 2, Name = "Тест"}
             }
          }
       };
       MainWindow.Show();
    }


    Вторая: у вас свойства вложенные. Поэтому нужно вложенные TextBox'ы делать. Код приложен с учётом, что вы сделали, как в предыдущем пункте.
    <StackPanel>
          <TextBlock Text="Service"/>
          <TextBox Text="{Binding Path=Id}"/>
          <StackPanel DataContext={Binding Info}>
                <TextBlock Text="InfoService"/>
                <TextBox Text="{Binding Path=Id}"/>
                <StackPanel DataContext={Binding Main}>
                      <TextBlock Text="ServiceMain"/>
                      <TextBox Text="{Binding Path=Id}"/>
                </StackPanel>
          </StackPanel>
    </StackPanel>


    Ну и сразу замечание на будущее. Имеет смысл PropertyChanged и метод RaisePropertyChanged выделить в отдельный класс, от которого в дальнейшем наследовать все ваши ViewModel (Service, InfoService, ServiceMain).
    Ответ написан
    Комментировать
  • Почему сравнение эта string строка не равна такой же строке после string.Format()?

    @Meloman19
    Потому что сравнение string и сравнение object - это разные вещи.
    String сравнивается посимвольно, как и должно быть, а у object сравниваются ссылки на экземпляры.

    Переменные client и broker компилятор для оптимизации ссылает на один и тот же экземпляр string, поэтому сравнение их, как object, возвращает True. В случае же agent, создаётся новый экземпляр string (Format вызывает new string()), поэтому сравнение их, как object, возвращает False.
    Ответ написан
    1 комментарий
  • Как можно избавиться от подобного мусора в коде?

    @Meloman19
    Множество лейблов, которые при наведении делают одно и то же? Не проще ли создать всего один обработчик и на него привязать события со всех нужных лейблов?
    private void label_MouseEnter(object sender, EventArgs e)
    {
       (sender as Label).ForeColor = Color.FromArgb(35, 33, 61);
    }
    
    private void label_MouseLeave(object sender, EventArgs e)
    {
       (sender as Label).ForeColor = Color.White;
    }


    Теперь во всех событиях указывает один и тот же обработчик.
    Ответ написан
    Комментировать