• Почему нет доступа к форме при использовании потока?

    Денис Машанов: вы весь код DoWork возвращаете в поток формы, поэтому форма "замораживается" :)
    Добавил правильный пример в свой ответ.
  • Nginx - как выключать и включать один из серверов в upstream?

    Мика Слепинин: содержимое подключенного таким образом файла должно быть использовано. Nginx в любом случае придется перезагружать (reload).
  • Почему не работает react native?

    Shane Matte: а используется 7.1.0? Например, в некоторых случаях, Visual Studio может использовать свою-старую копию Node.js.
  • Как правильно отправлять soap-запросы, используя C# (в особенности - на сервера AdvCash)?

    kir_cipher: это имя и адрес конечной точки в файле конфигурации (.config). При подключении службы, в файл конфигурации были добавлены параметры службы, в секцию system.serviceModel, там должен быть элемент endpoint. Это может быть полезно для тестирования или если одна служба имеет несколько конечных точек (доступна по разным адресам).

    Вот пример подключения веб-службы и конфигурация вручную: https://msdn.microsoft.com/ru-ru/library/ms731862.aspx

    При подключении через Visual Studio, файлы службы можно найти в папке Service References. Необходимые классы должны быть в файле Reference.cs.
  • Как изменить textbox формы из другого класса?

    server = new ServerObject();
    server.SendMessage += Cl_SendMessage;
    listenerThread = new Thread(new ThreadStart(server.Listen));
    listenerThread.Start(); // старт потока

    // Прослушивание входящих подключений
    protected internal void Listen()
    {
      try
      {
        listener = new TcpListener(IPAddress.Any, 8888);
        listener.Start(); // запуск прослушивания входящих запросов
    
        while (true)
        {
          TcpClient tcpClient = listener.AcceptTcpClient(); // принимаем ожидающий запрос на подключение
    
          ClientObject clientObject = new ClientObject(tcpClient, this);
          clientObject.SendMessage += this.SendMessage;
          Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
          clientThread.Start(); // старт потока
        }
      }
      catch (Exception exc)
      {
        Disconnect();
      }
    }
  • Как изменить textbox формы из другого класса?

    Евгений: проблема в том, что SendMessage имеет значение null. Что касается решения, то можно добавить SendMessage на уровень ServerObject и при появлении новых клиентов, передавать им ссылку на SendMessage (clientObject.SendMessage += this.SendMessage).
    Там еще в BroadcastMessage видимо придется вызывать SendMessage или еще куда-то, вам виднее, настолько углубляться не будут :-)
  • Как изменить textbox формы из другого класса?

    Евгений: Server/ProgramServer.cs метод Process, есть комментарий в блоке исключения: "Когда-нибудь здесь что-то будет...". Нельзя перехватывать ошибки и ничего не делать :-) В данном случае проблем в том, что SendMessage является null, что приводит к исключению при попытке его вызова. Это как минимум.
  • Как изменить textbox формы из другого класса?

    Евгений: и что именно не работает? Ошибки есть какие-нибудь? Точки остановка ставили, срабатывают?
  • Какова правильная последовательность вызова методов Web Api?

    babaevmm: идентификатор - для идентификации, т.к. секретный ключ - это производная строка (пользователь может сам ее указать/поменять). Можно сказать, что идентификатор - это логин, а секретный ключ - пароль.

    Маркер доступа - это для конечных пользователей. На случай, если кто-то из клиентов API захочет сделать продукт для своих пользователей. Получается следующая схема:

    1. Сервер API;
    2. Клиент API - делает какой-то продукт, используя API;
    3. Пользователь - использует готовый продукт, он может не знать о существовании API.

    Клиент API выдает маркеры доступа своим пользователям. Метод получения маркера доступа требует указания идентификатора и секретного ключа. Таким образом, маркер доступа привязывается к конкретному клиенту, а при использовании - к пользователю. Это позволяет лучше контролировать использование API. Можно выявить хулиганов и изолировать их :-) При этом начать не с клиента, а с его отдельных пользователей (в итоге, клиент может вообще не узнать, что что-то произошло).
  • Какова правильная последовательность вызова методов Web Api?

    babaevmm: если пользователь прошел проверку подлинности в устройстве или на сайте на котором он находится, то нет необходимости заставлять его проходить повторную проверку на уровне API.

    Например, протокол OAuth используется на многих популярных сайтах. Пользователь проходит процедуру аутентификации на сайте поставщика и затем дает разрешение на доступ внешнему приложению, которое на выходе получает маркер доступа, с помощью которого работает с API. Возьмем, для примера, Facebook. Если пользователь часто посещает Facebook, то у него в браузере есть cookies, по которым Facebook может идентифицировать пользователя.
    Если завершился срок действия маркера доступа выданного приложению, то приложение перенаправляет пользователя на страницу авторизации Facebook, который находит свои куки и просто создает новый маркер доступа и возвращает пользователя обратно в приложение. Весь этот процесс для пользователя пройдет незаметно.

    Если рассматривать приложение Android, то на уровне Android пользователь ведь тоже уже должен быть каким-то образом авторизован. Следовательно, получив разрешения один раз, приложение сможет обновлять маркер доступа без явного участия пользователя.

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

    Еще один пример: у меня, на временно заброшенном и местами сломавшемся, api.foxtools.ru/v2 клиенты (пользователи API) могут выдавать маркеры доступа своим пользователям. Для этого предлагается использовать секретный ключ, который нельзя публиковать в открытом доступе. Т.е. приложение клиента, на стороне сервера, с помощью секретного ключа отправляет запрос на сервер API и получает маркер доступа, который передает своему пользователю. При первом запросе пользователя к API, с использованием маркера доступа, в базу записывается IP, с которого сделан запрос. Таким образом маркер доступа привязывается к конкретному пользователю и не может быть использован пользователями с другими IP. Во такая мудреная система, которая позволяет идентифицировать пользователей и дает возможность клиентам обойти ограничение в 1 000 запросов в сутки с одного IP :-)
  • Какова правильная последовательность вызова методов Web Api?

    babaevmm: да.

    В случае с Android, думаю пользователю будет достаточно зарегистрироваться или один раз авторизоваться и получить первый маркер доступа, а обновление уже может происходить без участия пользователя. Можно сделать привязку к IP и/или устройству, это усложнит неправомерное получение доступа.
  • Как сделать все ячейки равных размеров в tableLayoutPanel WinForms?

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

    Примерно так (не проверял):

    По малой стороне таблицы: Math.Min(tableLayoutPanel.Width, tableLayoutPanel.Height)
    (если по большой, то на выходе может не получиться квадрат)

    Размер таблицы: 500x300px
    Малая сторона: 300px

    Необходимый размер квадрата: 75%

    Получаем размер квадрата в пикселях:
    300px - 100%
    x - 75%

    x = (300px * 75%) / 100% = 225px размер квадрата

    Расчет ширины:
    500px - 100%
    225px - x%

    x = (225px * 100%) / 500px = 45% ширина квадрата
    100% - 45% = 55% общая ширина колонок по бокам
    55% / 2 колонки = 27.5% ширина одной колонки

    Расчет высоты:
    300px - 100%
    225px - x%

    x = (225px * 100%) / 300px = 75% высота квадрата
    100% - 75% = 25% общая высота строк по бокам
    25% / 2 строки = 12.5% высота одной строки

    Поймать изменение размера можно в событии Resize, либо у формы, либо у самого TableLayoutPanel.
  • Заняты ли потоки при использовании async/await?

    Михаил: если еще нет, то рекомендую установить dotPeek. Помимо декомпилирования в C#, там есть возможность посмотреть IL, в котором будет видно, что происходит с кодом. А вот тут можно получить информацию об инструкциях.
  • Заняты ли потоки при использовании async/await?

    Михаил: в потоке, который породил асинхронную операцию.
    https://msdn.microsoft.com/magazine/gg598924.aspx
    Четкого определения истинного «контекста» SynchronizationContext нет. В разных инфраструктурах и хостах могут быть определены свои контексты.

    WindowsFormsSynchronizationContext (System.Windows.Forms.dll: System.Windows.Forms) Приложения Windows Forms будут создавать и устанавливать WindowsFormsSynchronizationContext в качестве текущего контекста для любого потока, который создает UI-элементы. Этот SynchronizationContext использует методы ISynchronizeInvoke применительно к UI-элементу, который передает делегаты нижележащему Win32-циклу обработки сообщений. Контекст для WindowsFormsSynchronizationContext — единственный UI-поток.

    Все делегаты, которые ставятся в очередь к WindowsFormsSynchronizationContext, выполняются по одному конкретным UI-потоком в том порядке, в каком они были поставлены в очередь. Текущая реализация создает один WindowsFormsSynchronizationContext для каждого UI-потока.

    AspNetSynchronizationContext (System.Web.dll: System.Web [внутренний класс]) SynchronizationContext в ASP.NET устанавливается в потоках из пула, когда они выполняют код страницы. Делегат, помещаемый в очередь полученного AspNetSynchronizationContext, восстанавливает идентификацию и культуру исходной страницы, а затем напрямую выполняет делегат. Этот делегат вызывается напрямую, даже если он ставится в очередь «асинхронно» вызовом Post.

    С концептуальной точки зрения, контекст AspNetSynchronizationContext весьма сложен. В течение срока жизни асинхронной страницы контекст начинает всего с одним потоком из пула потоков ASP.NET. После выдачи асинхронных запросов контекст не включает никаких потоков. По мере завершения асинхронных запросов потоки из пула, выполняющие свои процедуры завершения, входят в контекст. Это могут быть те же потоки, которые инициировали запросы, но с большей вероятностью они представляют собой свободные потоки, которые были на момент завершения операций.
  • Как сделать все ячейки равных размеров в tableLayoutPanel WinForms?

    NikHaker: можно сделать размер в пикселях, чтобы квадрат оставался квадратом. Либо рассчитать размер в процентах для каждой строки и колонки в зависимости размера элемента.

    А если нужна просто сетка, то проще её нарисовать.
  • Как сделать все ячейки равных размеров в tableLayoutPanel WinForms?

    Дополню:
    // получаем элемент из ячейки
    var control = tableLayoutPanel.GetControlFromPosition(0, 0);
    // удаляем, т.к. больше одного элемента нельзя размещать
    tableLayoutPanel.Controls.Remove(control);
    // добавляем новый элемент в ячейку
    tableLayoutPanel.Controls.Add(new Label { Text = "это новый элемент" }, 0, 0);
  • Как сделать все ячейки равных размеров в tableLayoutPanel WinForms?

    NikHaker: GetControlFromPosition:
    // индексация с нуля
    // 0 - первая колонка, 0 - первая строка
    var control = tableLayoutPanel.GetControlFromPosition(0, 0);
  • Как сделать все ячейки равных размеров в tableLayoutPanel WinForms?

    NikHaker: если вам нужен одинаковый размер ячеек, в зависимости от размере контейнера, то да, только использование процентов решит данную проблему. Если вам нужен фиксированный размер, то просто укажите его, используйте SizeType.Absolute вместо SizeType.Percent.
  • Как сделать все ячейки равных размеров в tableLayoutPanel WinForms?

    NikHaker: Программно создать TableLayoutPanel можно также, как это делается в конструктора форм (см. файлы *.Designer.cs):
    var tableLayoutPanel = new TableLayoutPanel();
    tableLayoutPanel.ColumnCount = 3;
    tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F));
    tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 70F));
    tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F));
    tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
    tableLayoutPanel.Location = new System.Drawing.Point(0, 0);
    tableLayoutPanel.RowCount = 3;
    tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
    tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
    tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
    tableLayoutPanel.Visible = true;
    
    var rnd = new Random(DateTime.Now.Millisecond);
    
    for (int col = 0; col < tableLayoutPanel.ColumnCount; col++)
    {
      for (int row = 0; row < tableLayoutPanel.RowCount; row++)
      {
        var panel = new Panel();
        panel.BackColor = Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255));
        panel.Dock = DockStyle.Fill;
        tableLayoutPanel.Controls.Add(panel, col, row);
      }
    }
    
    this.Controls.Add(tableLayoutPanel);<ph index="1"></ph>