我在使用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参数。但是,它在其他线程中运行,并且在阻塞开始之前不会更改usr_OK参数。我已经尝试了thread.join,但应用程序冻结了,我不知道还能做什么。请帮助WCF我可以等待me...how方法返回参数usr_OK吗?
发布于 2010-05-25 20:31:28
对你的问题最直接的回答是: 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);您会发现系统的很多部分都会变成异步代码库,但这可能需要您重新调整您的期望。
发布于 2010-05-25 19:39:15
在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);
}
}https://stackoverflow.com/questions/2904102
复制相似问题