Как обработать долго работающую «нить» в WPF? - PullRequest
4 голосов
/ 23 мая 2009

добрый вечер!

В настоящее время я разрабатываю wpf-клиент для некоторого отдыха. общение с остальной службой не является проблемой и выполняется в дополнительной сборке (интерфейс связи).

в основном:
У меня есть кнопка поиска, которая выполняет метод. этот метод связывается со службой, обновляет некоторые текстовые поля и индикатор выполнения (чтобы дать пользователю некоторую графическую информацию, как далеко мы находимся ...). К сожалению, сервер, на котором размещается служба, немного хромает, вызывая некоторое серьезное время отклика (около 4 секунд). это, с другой стороны, заставляет мое wpf-приложение ждать, что в итоге приводит к черному цвету и названию «не отвечает» ...

Я уже пытался поместить это выполнение в другой поток, но ... логично, что я не получу никакого доступа к элементам управления моего wpf-окна ...

атм, я действительно беспомощен ... может кто-нибудь дать мне какую-нибудь рутину или решение?

Ответы [ 2 ]

5 голосов
/ 23 мая 2009

Ваш поток пользовательского интерфейса занят ожиданием ответа от веб-службы и недоступен для рисования на экране. Один хороший вариант - отправить запрос на обслуживание другому потоку, не являющемуся пользовательским интерфейсом. Посмотрите на BackgroundWorker , который был разработан специально, чтобы сделать это легко. Он обрабатывает маршалинг вызовов между потоками из не-пользовательского интерфейса в потоки пользовательского интерфейса.

Грубо:

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync(arg);
...

static void bw_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = (BackgroundWorker)sender;
    int arg = (int)e.Argument;
    e.Result = CallWebService(arg, e);
}

static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Increment();
}

static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    label.Text = "Done: " + e.Result.ToString();
}
0 голосов
/ 23 мая 2009

Для доступа к вашим элементам управления из второго потока используйте Dispatcher.BeginInvoke:

Dispatcher.BeginInvoke(new Action(() =>
    {
        // Update your controls here.
    }), null);

Или вы можете использовать BackgroundWorker .

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