WCF服务方法同步/异步

时间:2010-05-25 11:28:41

标签: wcf silverlight multithreading

我在使用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。

2 个答案:

答案 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);
    }
}