Как позвонить в веб-сервис, не блокируя выполнение клиента? - PullRequest
0 голосов
/ 20 ноября 2011

У меня есть приложение Windows Forms, которое выполняет вызовы веб-служб через прокси-серверы, сгенерированные с помощью SvcUtil из дескрипторов WSDL. Эти звонки могут длиться минуты, и в течение этого времени я не хочу, чтобы клиентское приложение «зависало». Что мне нужно сделать, чтобы достичь этого? Я думаю, что-то связанное Threading, но я не уверен, как управлять возвращаемыми значениями и параметрами в этом случае.

Ответы [ 4 ]

3 голосов
/ 20 ноября 2011

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

private void wrk_DoWork(object sender, DoWorkEventArgs e)
{
    // Do your work here
}

private void wrk_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // Executed when worker completed its execution
}

private void StartIt()
{
    BackgroundWorker wrk1 = new BackgroundWorker();
    wrk1.DoWork += wrk_DoWork;
    wrk1.RunWorkerCompleted += wrk_RunWorkerCompleted;
    wrk1.RunWorkerAsync();
}
2 голосов
/ 20 ноября 2011

Я бы пошел на фонового работника.

Установите событие RunWorkerCompleted и DoWork, запустите его и, когда вы получите свой результат в DoWork, установите аргумент события для вашего результата (e.Result).

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    // Do your processing
    e.Result = result;
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
     ResultLabel.Text = (string)e.Result;
}

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

using System.ComponentModel;

Больше информации здесь: http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

Надеюсь, это поможет!

1 голос
/ 20 ноября 2011

Вы можете использовать методы, которые начинаются с Begin ......

например, используйте BeginAbc() вместо Abc()

0 голосов
/ 20 ноября 2011

Я бы порекомендовал посмотреть на BackgroundWorkers ..

BackgroundWorker proxyWorker = new BackgroundWorker();
proxyWorker.DoWork +=
   (sender, args) =>
   {
     //make proxy call here
   };

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