【问题标题】:How to sync WebService operation in silverlight?如何在 silverlight 中同步 WebService 操作?
【发布时间】:2014-12-29 15:47:22
【问题描述】:

我现在正在进行一个关于使用 Silverlight 和 Web 服务(asmx 页面)控制设备的项目。项目流程如下:

按下silverlight UI上的按钮,它会通过socket发送一个包到中间线。然后 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 应用程序时,UI 上的按钮都无法正确加载其状态。我知道原因是因为GetPR函数来自webservice(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 服务。 以上问题是我遇到的问题,谁能给我一些启发?

【问题讨论】:

    标签: web-services silverlight sync


    【解决方案1】:

    “GetPR”方法仍在异步运行,因此“ButtonStateModel”getter 将立即返回 null(“完成”操作将不起作用)。而且,您不想在 getter 中使用任何类型的阻塞,因为这会阻塞 UI。相反,您应该将“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;
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2014-11-04
      相关资源
      最近更新 更多