如何在WP7中使用带有异步调用的Dispatcher?

时间:2010-08-30 20:17:35

标签: c# silverlight asynchronous windows-phone-7 dispatcher

我无法找到这样的例子,但我确信那里肯定会有一些例子。

当用户单击按钮进行登录时,按钮单击上的事件处理程序将调用记录用户的功能。根据用户,可以将它们带到多个启动屏幕之一。从服务调用返回屏幕的信息。据我所知,Dispatcher.BeginInvoke仅用于更新UI线程,因此确定要导航到哪个页面的逻辑应该在传递给Dispatcher.BeginInvoke的方法中,对吗?

我需要进行服务调用并根据结果采取行动。我是否必须首先进行异步服务调用并从回调中调用Dispatcher?我是否将执行验证的函数调用,调用服务,并将回调作为传递给Dispatcher的委托进行处理?

很抱歉,如果这是一个基本问题。我发现的示例只使用Dispatcher来更新文本框或其他一些简单的项目。我没有找到UI线程需要根据异步调用的结果采取行动的任何内容。

3 个答案:

答案 0 :(得分:5)

目前尚不清楚您正在谈论的验证,但是:

  • 异步调用服务,并在服务调用完成时执行回调
  • 在回调中,执行涉及的非UI相关工作,然后调用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.
});