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 调用完成事件未按正确顺序触发的主要内容,如果未能解决你的问题,请参考以下文章