Я работаю с довольно сложным графическим интерфейсом и пытаюсь передать много данных из графического интерфейса в backgroudWorker. Проблема, с которой я сталкиваюсь, - это доступ к некоторым значениям GUI из фонового рабочего. Например, если я пытаюсь получить ComboBox.Text
, я получаю InvalidOperationException
из-за многопоточности. Однако, если я скажу do TextBox.Text
, кажется, все работает нормально. Конечно, я довольно новичок в C #, поэтому мне немного непонятно, почему некоторые из них в порядке, а другие терпят неудачу.
Я придумала несколько способов решения своих проблем, но ищу лучшую практику у человека, имеющего опыт работы с c #.
Вот несколько способов исправить это
создайте класс / структуру всех значений, которые вы хотите передать фоновому работнику, и передайте это при вызове RunworkAsync. Я не нашел это очень привлекательным, поскольку мне нужно было создать класс / структуру для каждой страницы в моем GUI, чтобы передать ее в backgroundWorker
Создайте группу различных фоновых работников, у которых была определенная задача. У меня все еще были некоторые проблемы с передачей данных, но объем данных, которые я должен был передать, был значительно сокращен. Однако число DoWork / ProgressChanged / RunworkerCompleted значительно возросло, что оказалось далеко не идеальным.
(это привело меня к тому, что я сейчас делаю)
создать делегата и метод для сбора информации
private delegate string ReadComboDelegate(ComboBox c);
private string ReadComboBox(ComboBox c)
{
if(c.InvokeRequired)
{
ReadComboDelegate del = new ReadComboDelegate(this.ReadComboBox);
return (string) c.Invoke(del,c);
}
else
{
return c.Text
}
}
затем в DoWork
сделайте что-то вроде string txt = this.ReadComboBox(this.comboBox1);
Когда у вас простой графический интерфейс и вам не нужно передавать много данных, это довольно простая проблема. Тем не менее, чем больше элементов и сложных GUI становится, тем больше становится эта проблема. Если у кого-то есть какая-либо информация, которая облегчит это, я был бы признателен.
Спасибо