Метод службы WCF синхронный / асинхронный - PullRequest
0 голосов
/ 25 мая 2010

У меня проблема с вызовом методов службы WCF в Silverlight 3.

private bool usr_OK = false;

clientService.CheckUserMailAsync(this.mailTF.Text);


if (usr_OK == true)
{ isValidationOK = true; }
else { isValidationOK = false; MessageBox.Show("User already exists.", "User registered succes!", MessageBoxButton.OK); }

CheckUserMail должен изменить параметр usr_OK. Однако он работает в другом потоке и не изменяет параметр usr_OK до начала блока IF. Я попробовал thread.join, но приложение зависло, и я не знаю, что делать дальше. Пожалуйста, помогите мне ... как я могу ждать, пока метод WCF вернет param usr_OK.

Ответы [ 2 ]

2 голосов
/ 25 мая 2010

Самый прямой ответ на ваш вопрос: Не блокируйте вызовы WCF. Они затрудняют причину. Там, вполне вероятно, нет способа заблокировать, если вы даже пытались ... но не надо.

Проработка: режим работы для Silverlight - асинхронность. Это то, к чему вы должны привыкнуть при разработке в Silverlight. Из-за этого вам очень трудно что-либо блокировать.

Это хорошая вещь, на мой взгляд. Когда вы блокируете результат чего-то вроде вызова службы WCF, вы в конечном итоге блокируете пользовательский поток. Это требует некоторого привыкания со стороны разработчика, но опять же ... привыкнуть к нему.

Допустим, у вас есть код, который вы хотите использовать следующим образом (синхронно):

var theResult = clientService.DoSomething(foo);
Process(theResult);

Способ переписать его будет следующим (асинхронный):

clientService.DoSomethingCompleted += (sender, args) => Process(args.Result);
clientService.DoSomethingAsync(foo);

Делая шаг вперед, я хотел бы абстрагировать свои сервисы как интерфейсы (чтобы я мог заменить их при тестировании или работать в автономном режиме при разработке). Я использую это как возможность создать интерфейс, который выглядит следующим образом:

public interface IMyService
{
    void DoSomething(string input, Action<string> whenComplete);
}

Я внедряю сервис, подобный приведенному выше асинхронному коду, а затем, когда я его вызываю, он очень чистый и простой:

myService.DoSomething(foo, Process);

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

1 голос
/ 25 мая 2010

Привязать код, который проверяет переменную usr_OK в обработчике событий для CheckUserMailCompletedEvent

clientService.CheckUserMailCompleted += new EventHandler<CheckUserMailCompletedEventArgs> (clientService_CheckUserMailCompleted);
clientService.CheckUserMailAsync(this.mailTF.Text);


void clientService_CheckUserMailCompleted(object sender, CheckUserMailCompletedEventArgs e) {
    if (usr_OK == true) {
        isValidationOK = true; 
    }
    else {
        isValidationOK = false; 
        MessageBox.Show("User already exists.", "User registered success!", MessageBoxButton.OK);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...