我正在对Web服务进行异步调用。由于可能需要几秒钟,因此使用状态标签让用户知道发生了什么。但即使呼叫是异步的,第一个呼叫似乎会阻塞几秒钟,状态标签需要很长时间才能更新。在WinForms中,我可以强制标签刷新(我认为使用Update())但不能在WPF中刷新。有什么超级简单的方法可以让它发挥作用吗?
谢谢, 格里
答案 0 :(得分:1)
您可以将整个调用逻辑移动到QueueWorkUserItem或BackgroundWorker块中。这样,第一个代理初始化不会阻止UIThread(在异步之前。开始/结束模式开始)。假设您正在使用数据绑定,那么暴露绑定到Label的属性的对象实现了INotifyPropertyChanged,一切都应该自动发生。
答案 1 :(得分:0)
我(疯狂地)猜测阻塞是由于服务代理类的创建/初始化造成的。如果是这样,您可以尝试更早地创建代理,或者在另一个线程中调用异步Web服务。
关于刷新控件的问题的一般答案......我一直依靠数据绑定来做到这一点。如果主UI线程卡住做某事,那将无济于事。如果UI线程卡住了,我不知道有什么方法可以让它绘制。
答案 2 :(得分:0)
没有办法告诉标签要刷新,这实际上会对你的情况起作用。如果UI被阻止,则不会刷新。基本上,当您实际到达更新标签文本的位置时,它将显示在WPF中。我能想到的唯一可能的例外是,如果你使用的是非WPF控件,但即使这样它也应该可以工作。
我的建议是在执行第一个操作之前更新标签(甚至在变量初始化之前,因为这可能是问题的实际位置)。这是我的意思的伪代码示例(以防万一我不清楚):
private void KickOffProcess()
{
label1.Text = "Processing ..."; //This is where you need to move the label update code
AsyncCall();
}