2014-11-03 65 views
0

我现在正在通过使用silverlight和web服务(asmx页面)控制设备的项目。该项目流程如下:如何同步Silverlight中的WebService操作?

按下silverlight用户界面上的按钮,它会通过使用套接字发送一个包到中间线。然后middlewire将接受包并解构它并返回另一个包到silverlight UI。我使用下面的代码加载按钮状态,这将触发数据库查询:

private ButtonStateModel _buttonStateModel = new ButtonStateModel() { BtnOneImage = "Skins/images/flag/QU.png", BtnOneVisible = Visibility.Visible, BtnTwoVisible = Visibility.Collapsed }; 
    public ButtonStateModel ButtonStateModel 
    { 
     get 
     { 
        ButtonStateModel btnState = null; 
        dataService.GetPR(BusEquipmentPermission.Control.RtuID, BusEquipmentPermission.Control.DevID, (result) => 
        { 
         if (result != null && result.Count > 0) 
         { 
          var flag = result[0].PRFlag; 
          if (flag == 1) 
          { 
           btnState = new ButtonStateModel() 
           { 
            BtnOneImage = "Skins/images/flag/OP.png", 
            BtnOneVisible = Visibility.Visible, 
            BtnTwoImage = "Skins/images/flag/OFF.png", 
            BtnTwoVisible = Visibility.Visible 
           }; 
          } 
          else if (flag == 2) 
          { 
           btnState = new ButtonStateModel() 
           { 
            BtnOneImage = "Skins/images/flag/OFF.png", 
            BtnOneVisible = Visibility.Visible, 
            BtnTwoImage = "Skins/images/flag/OR.png", 
            BtnTwoVisible = Visibility.Visible 
           }; 
          } 
         } 
        }); 
        return btnState; 
     } 
     set 
     { 
      if (value == _buttonStateModel) 
      { 
       return; 
      } 
      _buttonStateModel = value; 
      RaisePropertyChanged("ButtonStateModel"); 
     } 
    } 

现在的问题是,每当我加载Silverlight应用程序,在用户界面上的按钮无法正常载入其状态。我知道的原因是因为该GetPR功能与web服务(ASMX),这是非常奇怪的,我不能在Silverlight中生成的客户端代码中使用的AutoResetEvent做同步操作:

public void GetPR(string rtuID, string devID, Action<List<BusControlPR>> action) 
    { 
     ServiceSoapClient proxy = new ServiceSoapClient(); 
     proxy.GetPRAsync(rtuID, devID); 
     proxy.GetPRCompleted += (sender, args) => 
     { 
      //I cannt do Sync Operation Here by using AutoResetEvent. 
      if (action != null) 
       action(args.Result.ToList()); 
     }; 
    } 

我使用web服务(ASMX页)而不是WCF ria服务。 上面的问题是我遇到的,任何人都可以给我一些亮光?

回答

0

“GetPR”方法仍然异步运行,因此“ButtonStateModel”getter将立即返回null(“完成”操作将不起作用)。而且,你不想在你的getter中使用任何阻塞,因为这会阻止用户界面。相反,您应该在初始化中放置“GetPR”,并使用以将“ButtonStateModel”属性设置为适当的值:

public class TheViewModel 
{ 
    public ButtonStateModel ButtonStateModel 
    { 
     get 
     { 
      return _buttonStateModel; 
     } 
     set 
     { 
      if (value == _buttonStateModel) 
      { 
       return; 
      } 
      _buttonStateModel = value; 
      RaisePropertyChanged("ButtonStateModel"); 
     } 
    } 

    public TheViewModel() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     dataService.GetPR(BusEquipmentPermission.Control.RtuID, BusEquipmentPermission.Control.DevID, (result) => 
     { 
      ButtonStateModel btnState = null; 
      if (result != null && result.Count > 0) 
      { 
       var flag = result[0].PRFlag; 
       if (flag == 1) 
       { 
        btnState = new ButtonStateModel() 
        { 
         BtnOneImage = "Skins/images/flag/OP.png", 
         BtnOneVisible = Visibility.Visible, 
         BtnTwoImage = "Skins/images/flag/OFF.png", 
         BtnTwoVisible = Visibility.Visible 
        }; 
       } 
       else if (flag == 2) 
       { 
        btnState = new ButtonStateModel() 
        { 
         BtnOneImage = "Skins/images/flag/OFF.png", 
         BtnOneVisible = Visibility.Visible, 
         BtnTwoImage = "Skins/images/flag/OR.png", 
         BtnTwoVisible = Visibility.Visible 
        }; 
       } 
      } 
      ButtonStateModel = btnState; 
     }); 
    } 
}