【问题标题】:Synchronous and asynchronous callbacks同步和异步回调
【发布时间】:2009-08-30 19:22:07
【问题描述】:

在阅读 MSDN 文档和代码示例时,我对某些术语感到困惑。

什么是 C# 中的回调?具体来说,什么是同步和异步回调?

请从外行的角度解释一下。

另外,请解释一下 IAsyncCallback IAsyncResult 接口。 我们如何实现它? (非常简单的例子)

提前致谢。

【问题讨论】:

    标签: c# .net callback iasyncresult


    【解决方案1】:

    IAsyncCallback接口不存在,无法实现。

    我怀疑你真的想知道IAsyncResult interface

    我建议你阅读 MSDN 上的this page


    IAsyncResult interface 表示在后台运行的操作(例如 Web 请求或数据库调用),而您的代码会继续执行。它可以告诉您操作是否完成(IsCompleted 属性)。它还为您提供了一个WaitHandle objectAsyncWaitHandle 属性),可用于等待操作完成。 (致电result.AsyncWaitHandle.WaitOne()

    您可以通过调用 BeginWhatever 方法获得 IAsyncResult。 (BeginExecuteReaderBeginGetResponse 和许多其他人)。 BeginWhatever 方法将采用操作所需的任何参数(例如,BeginExecuteReader 可以采用 CommandBehavior 参数),并且可以采用 AsyncCallback 委托(不是接口)和一个状态参数。 In 返回一个IAsyncResult 对象。

    AsyncCallback 委托是您提供的方法,将在操作完成时调用。它通常会在不同的线程上调用,所以要小心。您的 AsyncCallback 方法将获得与 BeginWhatever 方法之前给您相同的 IAsyncResult。 state 参数放入 IAsyncResult 并被系统忽略;您可以在 AsyncCallback 方法中使用它来跟踪操作的用途。 (状态可以是任何你想要的,包括null

    在您的 AsyncCallback(或其他任何地方)中,您可以调用与您调用的 BeginWhatever 方法对应的 EndWhatever 方法首先。您必须从 BeginWhatever 或从 AsyncCallback 给它 IAsyncResult。当您调用它时,它将等待操作完成(如果尚未完成),然后将操作结果返回给您。 (假设操作返回一些东西;例如,WebRequest.EndGetResponse 将返回 WebResponse)。如果操作过程中出现任何错误,EndWhatever 会抛出异常。


    如果您想创建自己的可以在后台运行的操作,您可以实现 IAsyncResult。您还将创建分别返回和接受它的 BeginWhateverEndWhatever 方法。有关实现 IAsyncResult 的更多信息,请参阅here

    【讨论】:

    • 抱歉拼写错误。正如你所说,我需要澄清 IAsyncResult。非常感谢你的解释。
    【解决方案2】:

    使用同步回调,调用方法(或线程)必须等到被调用方法完成才能继续处理 - 很像“普通”方法调用。

    通过异步回调,调用方法(或线程)可以继续处理其他输入或事件或其他任何内容,而无需等待被调用方法完成。

    对于应用程序用户界面线程,如果您不希望它在应用程序执行一些冗长的过程时“冻结”,您需要使用异步回调。

    【讨论】:

    • 感谢克里斯的解释
    • 没问题 - 不仅如此,我建议您在 MSDN 上阅读更多内容并在此处搜索有关多线程的问题。
    • 当然我会按照建议通过 MSDN。非常感谢
    【解决方案3】:

    回调只不过是一个委托。使用术语回调是因为您通常将它(委托)传递给方法(作为参数),然后在该方法中调用以发出信号。

    同步和异步回调就是这样。同步的,在调用该方法(启动操作)的同一线程上执行。异步通常在另一个线程上执行(但不总是)

    IAsyncCallback 接口是启动异步任务的模板。您传入一个回调(委托),该回调(委托)在工作完成时被调用。有一个属性可以判断方法是否同步执行。

    【讨论】:

      猜你喜欢
      • 2012-01-02
      • 2019-10-12
      • 1970-01-01
      • 2015-05-03
      • 2015-09-03
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多