【问题标题】:How to use Dispatcher with async call in WP7?如何在 WP7 中使用 Dispatcher 和异步调用?
【发布时间】:2010-08-30 20:17:35
【问题描述】:

我找不到这样的例子,但我确信肯定有一些。

当用户单击按钮进行登录时,按钮单击上的事件处理程序会调用使用户登录的函数。根据用户,他们可以被带到许多开始屏幕之一。从服务调用返回的屏幕信息。据我所知,Dispatcher.BeginInvoke 只是用来更新 UI 线程的,所以决定导航到哪个页面的逻辑应该在传递给 Dispatcher.BeginInvoke 的方法中吧?

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

抱歉,这是一个基本问题。我发现的示例仅使用 Dispatcher 来更新文本框或其他一些琐碎的项目。我还没有发现 UI 线程需要根据异步调用的结果采取行动的任何地方。

【问题讨论】:

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


    【解决方案1】:

    不清楚你在说什么验证,但是:

    • 异步调用服务,并在服务调用完成时执行回调
    • 在回调中,做任何非 UI 相关的工作,然后调用 Dispatcher.BeginInvoke 执行任何 UI 相关的操作。

    如果您需要在服务调用之前进行验证,这可能是按钮事件处理程序的一部分……至少只要它不是长时间运行的验证。

    如果您能详细说明流程中逻辑上涉及的步骤,那将有所帮助。

    【讨论】:

    • 我在发送服务调用之前验证了一些基础知识,例如用户名不为空或包含无效字符。你可以忽略那部分。
    【解决方案2】:

    看,Dispatcher 实际上持有 UI 线程。由于每个控件都具有很强的线程关联性,因此您需要使用 Dispatcher 对其进行更新。

    您可以从任何线程使用 DispatcherObject.Dispatcher 访问 Dispatcher。

    this.Dispatcher.Invoke((Action)(()=>{
     .//// your action
    });
    

    现在,当您需要更新线程中的元素时,您可以随时环绕上下文调用服务。您可以使用 Background 线程,也可以从 Dispatcher 线程内部调用来调用 Service 调用。

    如果调用是同步的,则从调度程序调用将保留 UI。因此,我建议您从更新调用程序下方的后台线程进行调用。

    【讨论】:

    • 请注意,WP7 没有 Invoke - 只有 BeginInvoke。
    【解决方案3】:

    所有服务调用在silverlight(以及windows phone 7)中都是异步的,所以是的,你所描述的就是你这样做的方式。

    不同的服务库提供了不同的方法来调用它们的方法——一些提供“调用完成”方法,另一些则采用传入的事件处理程序,但如果您想更新 UI(我假设这包括移动页面),无论哪种方式您需要在 UI 线程上执行此操作,这就是调度程序的用途。

    Dispatcher.BeginInvoke( () => {
       // This code is on the UI thread.
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2014-09-03
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多