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); 
    } 
} 
+0

好的...这将工作。但有没有办法等待方法结束。线程不缝工作。 – Rafal 2010-05-25 11:53:53

+0

我想使用私人AutoResetEvent m_autoResetEvent = new AutoResetEvent(false); – Rafal 2010-05-25 12:29:31

+0

这是silverlight的工作原理。设计不支持同步Web服务调用。 – 2010-05-25 12:34:20

最直接的回答你的问题的代码:不要在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); 

你会发现你的许多系统将变成异步代码库,但它可能需要你重新调整你的期望值。

+0

谢谢......我现在明白了:) – Rafal 2010-05-25 12:57:23