我无法找到这样的例子,但我确信那里肯定会有一些例子。
当用户单击按钮进行登录时,按钮单击上的事件处理程序将调用记录用户的功能。根据用户,可以将它们带到多个启动屏幕之一。从服务调用返回屏幕的信息。据我所知,Dispatcher.BeginInvoke仅用于更新UI线程,因此确定要导航到哪个页面的逻辑应该在传递给Dispatcher.BeginInvoke的方法中,对吗?
我需要进行服务调用并根据结果采取行动。我是否必须首先进行异步服务调用并从回调中调用Dispatcher?我是否将执行验证的函数调用,调用服务,并将回调作为传递给Dispatcher的委托进行处理?
很抱歉,如果这是一个基本问题。我发现的示例只使用Dispatcher来更新文本框或其他一些简单的项目。我没有找到UI线程需要根据异步调用的结果采取行动的任何内容。
答案 0 :(得分:5)
目前尚不清楚您正在谈论的验证,但是:
Dispatcher.BeginInvoke
执行任何与UI相关的操作。如果你需要在服务调用之前进行验证,那么这可能是你的按钮的事件处理程序的一部分......至少只要它不是一个长期运行的验证。
如果您可以提供有关您的流程中逻辑上涉及的步骤的更多详细信息,那将有所帮助。
答案 1 :(得分:3)
请参阅,Dispatcher实际上拥有UI线程。由于每个控件都具有强大的线程关联性,因此您需要使用Dispatcher更新它。
您可以使用DispatcherObject.Dispatcher从任何线程访问Dispatcher。
this.Dispatcher.Invoke((Action)(()=>{
.//// your action
});
现在,无论何时需要更新线程中的元素,都可以随时环绕上下文来调用服务。您可以使用Background线程,也可以从Dispatcher线程内部调用以调用Service调用。
如果呼叫是同步的,则调用来自调度程序将保留UI。所以我建议你在更新Invoker下面的后台线程中进行调用。
答案 2 :(得分:3)
所有服务调用在silverlight中都是异步的(因此也就是windows phone 7)所以是的,你所描述的就是你这样做。
不同的服务库提供了不同的方法来调用他们的方法 - 一些提供了'call complete'方法,另一些提供了一个事件处理器传入,但是如果你想要更新UI(我假设这包括移动页面)您将需要在UI线程上执行此操作,这是调度程序的用途。
Dispatcher.BeginInvoke( () => {
// This code is on the UI thread.
});