【问题标题】:WCF Service method synchronous/asyncWCF 服务方法同步/异步
【发布时间】:2010-05-25 11:28:41
【问题描述】:

我在使用 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 方法返回参数 usr_OK。

【问题讨论】:

    标签: wcf silverlight multithreading


    【解决方案1】:

    对您的问题最直接的回答:不要阻止 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);
    

    您会发现您的大部分系统将演变为异步代码库,但这可能需要您重新调整您的期望。

    【讨论】:

      【解决方案2】:

      在 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);
          }
      }
      

      【讨论】:

      • 好的...那会工作的。但是有没有办法等待方法结束。线程不接缝工作。
      • 我想使用私有 AutoResetEvent m_autoResetEvent = new AutoResetEvent(false);
      • 这就是 silverlight 的工作原理。设计上不支持同步 Web 服务调用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 2014-04-30
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多