我正在对web服务进行异步调用。因为可能需要几秒钟,所以有一个状态标签可以让用户知道发生了什么。但是,即使调用是异步的,第一个调用似乎会阻塞几秒钟,状态标签需要很长时间才能更新。在WinForms中,我可以强制标签刷新(我认为使用更新()),但在WPF中没有。有什么超简单的方法让这件事成功吗?
谢谢,格里
发布于 2011-05-20 22:16:46
您可以将整个调用逻辑移动到QueueWorkUserItem或BackgroundWorker块中。这样,第一个代理初始化就不会阻塞UIThread (在异步之前)。开始/结束模式开始)。假设您正在使用数据绑定对象,公开绑定到已实现的INotifyPropertyChanged标签的属性,那么一切都应该自动发生。
发布于 2011-05-20 21:59:56
我(疯狂地)猜测阻塞是由于创建/初始化服务代理类造成的。如果是这样,您可以尝试更早地创建代理,或者在另一个线程中调用异步web服务。
你关于刷新控件的问题的一般答案是..。我一直依赖于数据绑定来做到这一点。不过,如果主UI线程被卡在执行某些操作时,这将于事无补。如果UI线程被卡住了,我不知道是否有任何方法可以让它绘制。
发布于 2011-05-21 00:15:00
没有一种方法可以让标签刷新,这在您的情况下是可行的。如果UI被阻塞,它将不会刷新。基本上,当您实际达到更新标签文本的程度时,它将显示在WPF中。我能想到的唯一可能的例外是,如果您使用的是非WPF控件,但即使这样,它也应该能工作。
我的建议是在执行第一个操作之前更新标签(甚至在变量初始化之前,因为这可能是实际问题所在)。以下是我所指的伪代码示例(以防万一我还不清楚):
private void KickOffProcess()
{
label1.Text = "Processing ..."; //This is where you need to move the label update code
AsyncCall();
}https://stackoverflow.com/questions/6077898
复制相似问题