WCF服务方法同步/异步
我有调用WCF服务方法使用Silverlight 3WCF服务方法同步/异步
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 byt冻结的应用程序,我不知道该怎么做别的。请帮助我...我如何等待WCF方法返回参数usr_OK。
绑定来检查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);
}
}
最直接的回答你的问题的代码:不要在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);
你会发现你的许多系统将变成异步代码库,但它可能需要你重新调整你的期望值。
谢谢......我现在明白了:) – Rafal 2010-05-25 12:57:23
好的...这将工作。但有没有办法等待方法结束。线程不缝工作。 – Rafal 2010-05-25 11:53:53
我想使用私人AutoResetEvent m_autoResetEvent = new AutoResetEvent(false); – Rafal 2010-05-25 12:29:31
这是silverlight的工作原理。设计不支持同步Web服务调用。 – 2010-05-25 12:34:20