2014-11-03 64 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; 
     }); 
    } 
}