Доступ к потоку пользовательского интерфейса для Windows Forms после фонового рабочего? - PullRequest
0 голосов
/ 18 января 2012

Для моего приложения для форм Windows это подписчик службы wcf, и я использую фоновый рабочий класс для выполнения кодов подписки, чтобы при нажатии кнопки «подписаться» пользовательский интерфейс не зависал при попытке подключиться к услуге.

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

Следующая реализация была выполнена для метода postReceived (), который был создан в службе, и он обрабатывает то, что происходит, когда подписчик публикует публикацию (публикация подписки WCF)

        backgroundForm b = (backgroundForm)Application.OpenForms[0];

        b.BeginInvoke((MethodInvoker)delegate()
        {
            //codes to do whatever i wan to do with the GUI
            //Examples of it would be disposing a flowlayout panel 
            //and re-adding it back and populating it again to 
            //show the refreshed values.
        });

Кто-нибудь знает, как решить эту проблему?

EDIT

кроме кода UI, который не был выполнен, я также подчеркнул, что всякий раз, когда сообщение принимается, оно также отображает tempForm, который действует как всплывающее окно для пользователя для обратной связи, которая отправляется

            notificationForm tempForm = (notificationForm)notificationList[notificationList.Count - 1];
            tempForm.Show();

Приведенный выше код также не был выполнен.

Ответы [ 2 ]

1 голос
/ 18 января 2012

На самом деле вы можете вызывать службу WCF асинхронно без использования backgroundWorker .Проверьте ответы из этой темы .

Следующий вопрос, который вы должны задать себе: «Вы уверены, что Application.OpenForms [0] является вашей формой вызова?»

* 1008И, наконец, мне интересно, почему вы используете BeginInvoke вместо более простого метода Invoke () для обновления элементов пользовательского интерфейса.Это не должно быть длительной операцией.

Майн. Я ничего не понял в вашем коде - уточните, пожалуйста, какая у вас ошибка или проблема.

1 голос
/ 18 января 2012

Вам потребуется использовать System.Windows.Threading.Dispatcher для доступа к пользовательскому интерфейсу.

Попробуйте что-то вроде этого:

 b.BeginInvoke((MethodInvoker)delegate()
 {
    Dispatcher.Current.Invoke((Action)(DoTheUiThings());
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...