Функция C # ожидает загрузки пользовательского интерфейса перед возвратом - PullRequest
0 голосов
/ 08 мая 2011

Я пытаюсь написать функцию, которая будет динамически создавать страницы вкладок, заполнять вкладки, а затем возвращать данные о том, что они сделали. Есть события, которые сообщат мне, когда каждая вкладка будет готова, поэтому я смогу сказать, когда они все загрузятся.

Вся работа связана с пользовательским интерфейсом, и я понимаю, что пользовательский интерфейс должен происходить в основном потоке, поэтому мне кажется, что я не могу просто создать поток, чтобы сделать это, а затем ждать его в своей функции. Я неправильно понимаю проблему с пользовательским интерфейсом, который должен быть в главном потоке? Как я могу заставить свою функцию ждать, не блокируя работу, которая должна произойти в пользовательском интерфейсе?

РЕДАКТИРОВАТЬ: Чтобы уточнить, на вкладках есть элементы управления веб-браузера, которые будут загружать различные веб-страницы, поэтому они занимают некоторое время, и я получаю событие DocumentCompleted для каждой из них, когда она загружается. Идея такова: звонящий вручает мне список URL. Я открываю форму и создаю вкладку, содержащую элемент управления веб-браузера для каждого URL, и загружаю по одному URL в каждой вкладке. Они будут выполняться в разное время, каждый из которых запускает обработчик события DocumentComplete после загрузки страницы. Когда они все загрузятся, я хочу вернуть список данных исходному абоненту.

Ответы [ 2 ]

1 голос
/ 08 мая 2011

... и я понимаю, что пользовательский интерфейс должен происходить в основном потоке ...

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

MethodInvoker m = () => { label1.Text = "Another text"; };
if (InvokeRequired) {
    BeginInvoke(m);
}
else {
    m.Invoke();
}

вместо:

label1.Text = "Another text";

Если вы будете осторожны с этим, у вас не возникнет проблем с несколькими потоками.

Edit:
Посмотрите на ответ, который я дал на вопрос Ошибка клиентского кодирования для приложения чата , если вы хотите немного изменить этот код.

Редактировать 2:
Согласно вашей редакции, вот как я это сделал бы:

  1. Получение URL-адресов от пользователя
  2. Запустите каждый браузер и переменную, которая будет содержать количество открытых вами вкладок.
  3. Запустите индикатор выполнения или что-то, что говорит пользователю, что приложение работает ...
  4. Каждый раз, когда вы получаете событие DocumentComplete, вы уменьшаете переменную.
    Если значение переменной 0, то были загружены все страницы.
  5. Стоп индикатор прогресса
  6. Вернуть данные, которые вы хотите пользователю.

Теперь .. когда вам нужно будет использовать Invoke? Каждый раз, когда вы хотите получить доступ к некоторому элементу управления пользовательского интерфейса из фонового потока . В том случае, когда вы останавливаете индикатор выполнения ...

0 голосов
/ 08 мая 2011

Я не уверен, что понял вас правильно.В любом случае, посмотрите на это:

Как обновить графический интерфейс из другого потока в C #?

...