«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как безопасно обновлять элементы пользовательского интерфейса из без UI потоков в C#?

Как безопасно обновлять элементы пользовательского интерфейса из без UI потоков в C#?

Опубликовано в 2025-02-06
Просматривать:855

How to Safely Update UI Elements from Non-UI Threads in C#?

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

]

в коде C#, ошибка «операция по перекрестной трубе является недействительной: контроль доступа 'TextBox1» из потока, кроме потока, который создал элемент управления «TextBox1», потому что поток пользовательского интерфейса владеет управлением TextBox1 и доступа к Из другой потока будет вызовать конфликты ассоциации потоков.

]

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

]

делегат void setTextCallback (String Text); private void setText (строка текст) { if (this.textbox1.invokerequired) {{ SetTextCallback d = new SetTextCallback (setText); this.invoke (d, новый объект [] {text}); } еще { this.textbox1.text = text; } }
delegate void SetTextCallback(string text);

private void SetText(string text)
{
  if (this.textBox1.InvokeRequired)
  { 
    SetTextCallback d = new SetTextCallback(SetText);
    this.Invoke(d, new object[] { text });
  }
  else
  {
    this.textBox1.Text = text;
  }
}

private void serialport1_datareceived (отправитель объекта, system.io.ports.serialdatareceivedeventargs e) { txt = serialport1.readexisting (). ToString (); SetText (txt.toString ()); }
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
  txt  = serialPort1.ReadExisting().ToString();
  SetText(txt.ToString());
}
]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3