异步延迟问题
操作就是点击预览之后返回一个字符串,然后页面根据这个字符串来操作
但因为异步方法,所以会有延迟,返回的字符串总是空
求教怎么解决?
我看有个帖子说可以加个延迟System.Threading.Thread.Sleep(1000);
可是我不知道这个延迟应该加在哪?
这是页面的代码,点击预览执行方法
- C# code
//预览//.sfvm是viewmodel层this._sfvm.AsynchronousMessage += new EventHandler<HandMessage>(_sfvm_AsynchronousMessage);private void btnView_Click(object sender, RoutedEventArgs e){ FaxInfo fax = modelToFaxInfo(this._sfvm.FaxModel); this._sfvm.getFaxTifFileUri(fax);}void _sfvm_AsynchronousMessage(object sender, HandMessage e){ if (!string.IsNullOrEmpty(e.Result)) { sourseUrl = e.Result; } else { messageBox = new cwMessageBox("无法生成预览"); messageBox.Show(); }}这是viewmodel层
- C# code
public void getFaxTifFileUri(FaxInfo fax, CustomException ex){ FaxServiceProxy.FaxServiceClient proxy = new FaxServiceClient(); proxy.GetFaxTifFileUriCompleted += new EventHandler<GetFaxTifFileUriCompletedEventArgs>(proxy_GetFaxTifFileUriCompleted); proxy.GetFaxTifFileUriAsync(fax, ex);}void proxy_GetFaxTifFileUriCompleted(object sender, GetFaxTifFileUriCompletedEventArgs e){ if (e.Error==null) { HandMessage hm = new HandMessage(); hm.Result = e.Result; AsynchronousMessage(null, hm); }}/// <summary> 回调事件/// </summary>public event EventHandler<HandMessage> AsynchronousMessage;[解决办法]
加在获取数据之后,因为获取数据是异步的,但是我感觉这种方法不太好,可以使用一个StoryBoard,在启动异步的时候设一个bool变量为false,StoryBoard启动,然后在StoryBoard completed事件中不停的检测bool变量,如果还是false则StoryBoard继续begin,子线程数据读取完毕后,将bool变量置为true,StoryBoard completed事件中发现bool变量为true了,知道子线程数据读取完毕,然后就可以操作数据了。
[解决办法]
你把读取返回字符串的代码写在异步回调函数里就可以,至于UI中你可以放一个loading动画之类的东西过度一下