Многопоточность / C #: можно ли выполнить BeginInvoke для нескольких элементов пользовательского интерфейса? - PullRequest
3 голосов
/ 19 декабря 2010

Допустим, я в рабочем потоке и хочу изменить несколько элементов пользовательского интерфейса, кнопку, текстовое поле и т. Д.

Нужно ли вызывать BeginInvoke для каждого элемента? то есть.,

  myButton.BeginInvoke(someMethod);
  myTextBox.BeginInvoke(someOtherMethod);

Или есть способ сделать один BeginInvoke и затем обновить несколько элементов пользовательского интерфейса? Спасибо

Ответы [ 3 ]

4 голосов
/ 19 декабря 2010

Нет, это не обязательно. Если ваше приложение не запускает несколько циклов сообщений (крайне маловероятно, и вы не будете определенно знать, если это так), то совершенно неважно, какой элемент управления вы вызываете BeginInvoke; все, что он делает, это передает делегат и аргументы в очередь, которая обрабатывается как часть цикла сообщений. Строго говоря, не должно быть никакой связи между элементом управления, с которым вы взаимодействуете, и элементом управления, который вы вызываете BeginInvoke.

3 голосов
/ 19 декабря 2010

Просто вызовите BeginInvoke в форме и обновите все элементы управления оттуда.


@ Джеймс Блэк: Мой ярлык - добавить метод, подобный этому:

private IAsyncResult BeginInvoke(MethodInvoker method) {
    return BeginInvoke((Delegate)method);
}

Тогданазвать это как:

BeginInvoke(() => {
    txtName.Text = name;
});
0 голосов
/ 20 декабря 2010

Если вы можете использовать платформу параллельного расширения, я нашел это полезным:

TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

Я сделал это в своем конструкторе, поэтому я был в основном потоке.

Тогда я бы назвал Task, поэтому сделайте так: private void changeElements () {(new Task (() => {// do ui update})). Start (uiScheduler);}

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

Но, как было указаноу вас нет необходимости вызывать несколько вызовов BeginInvoke для обновления пользовательского интерфейса, поскольку после первого вы уже находитесь в главном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...