我在使用Silverlight 3调用WCF服务方法时遇到问题。
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参数。但是它在其他线程中运行,并且在IF块开始之前它不会更改usr_OK参数。我已经尝试了解冻应用程序的thread.join,我不知道该怎么做。请帮帮我...我怎么能等待WCF方法返回param usr_OK。
答案 0 :(得分:2)
您问题的最直接答案:不要阻止WCF通话。他们因为某个原因而难以理解。如果你甚至尝试过,很可能无法阻止......但是没有。
详细说明:Silverlight的操作模式是Asyncronicity。在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 :(得分:1)
在CheckUserMailCompletedEvent的事件处理程序中绑定检查usr_OK变量的代码
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);
}
}