wcf 调用完成事件未按正确顺序触发

Posted

技术标签:

【中文标题】wcf 调用完成事件未按正确顺序触发【英文标题】:wcf call completed event is not fired in correct order 【发布时间】:2016-11-23 22:40:45 【问题描述】:

在我的 Silverlight 应用程序中,我将 WCF 调用放在 ViewModel 类中。

DateTime CurrentDateTime;
internal void GetDateTime()

    var client = new WcfClient();
    client.GetCurrentDateTimeCompleted += GetCurrentDateTimeCompleted;
    client.GetCurrentDateTimeAsync();


private void GetCurrentDateTimeCompleted(object sender, GetCurrentDateTimeCompletedEventArgs args)

     try
     
          CurrentDateTime = args.Result;
     

然后在我的代码后面的代码 some.xaml.cs 文件中。我有一个复选框点击事件。

    private void CheckBox_Clicked(object sender, RoutedEventArgs e)
    
        var msgBoxControl = new MessageBoxControl();
                msgBoxControl.Closed -= MessageBoxYesNo_Closed;
                msgBoxControl.Closed += MessageBoxYesNo_Closed;

在方法MessageBoxYesNo_Closed内部,我调用ViewModel类中的方法。

private void MessageBoxYesNo_Closed(object sender, EventArgs e)

    try
    
        this.ViewModel.GetDateTime();
        curDateTime = this.ViewModel.CurrentDateTime;

我的问题是,有时curDateTime = this.ViewModel.CurrentDateTime; 行是在 wcf 调用完成方法之前执行的,所以我无法得到正确的值。

我猜可能有两个线程,一个在 UI 中,另一个在服务调用中?请不要使用 async/await,因为我必须使用 Visual Studio 2010。

谢谢

【问题讨论】:

这里的问题(我怀疑)是GetCurrentDateTimeAsync 方法是异步的,这意味着在您的MessageBoxYesNo_Closed 处理程序中,GetDateTime 方法将在完成之前返回。我没有使用 silverlight 的经验,但如果支持,我建议考虑使用 async/await。 确实,您运行异步调用以获取时间,然后立即向控件询问值。但是异步请求可以稍后完成。因此,您可以同步请求数据GetCurrentDateTime,然后将值设置为 ViewModel,但如果请求花费太多时间,它可能会冻结您的 UI 线程。或者在异步请求完成时使用 async/await 设置 curDateTime。但是,如果用户想在对话框关闭后立即查看时间,这可能会让用户感到困惑。或者你可以使用一些等待指示器... 我用的是 Visual Studio 2010,所以不支持 async/await。 Visual Studio 2015 社区版是免费的 :)。否则,您将需要修改您的代码,使其在完成的事件触发之前不访问CurrentDateTime @Phaeze,我必须使用 VS 2010,别无选择。不知道如何修改代码,所以我发布了这个问题。 【参考方案1】:

得到解决方案,只需添加一个while循环:

            this.ViewModel.GetDateTime();

            while (true)
            
                this.ViewModel.CurrentDateTime = DateTime.Now;
                if (this.ViewModel.CurrentDateTime != DateTime.MinValue)
                    break;
            
            curDateTime = this.ViewModel.CurrentDateTime;

【讨论】:

以上是关于wcf 调用完成事件未按正确顺序触发的主要内容,如果未能解决你的问题,请参考以下文章

嵌套 Cloudkit 查询未按正确顺序打印

Node Js Async 未按正确顺序运行并跳过承诺

气流动态生成的任务未按顺序运行

Firebase 查询未按正确顺序执行?

CLGeoCoder 未按正确顺序附加地标

条带 webhook 未按正确顺序传入的错误