代码之家  ›  专栏  ›  技术社区  ›  Dirk Vollmar

异步-它是如何工作的?

  •  47
  • Dirk Vollmar  · 技术社区  · 14 年前

    微软宣布 Visual Studio Async CTP async await 用于异步方法执行的关键字。

    white paper 安德斯·赫茨伯格的 PDC presentation

    如何在同一线程上并行执行操作?它在技术上是如何可能的,在IL中实际翻译的功能是什么?

    3 回复  |  直到 10 年前
        1
  •  81
  •   Tomas Petricek    12 年前

    它的工作原理与 yield return C#2.0中的关键字。

    await 是状态机的一个“步骤”。

    这意味着当方法启动时,它只运行第一步,然后状态机返回并安排一些要完成的工作—当工作完成时,它将运行状态机的下一步。例如,此代码:

    async Task Demo() { 
      var v1 = foo();
      var v2 = await bar();
      more(v1, v2);
    }
    

    会被翻译成:

    class _Demo {
      int _v1, _v2;
      int _state = 0; 
      Task<int> _await1;
      public void Step() {
        switch(this._state) {
        case 0: 
          this._v1 = foo();
          this._await1 = bar();
          // When the async operation completes, it will call this method
          this._state = 1;
          op.SetContinuation(Step);
        case 1:
          this._v2 = this._await1.Result; // Get the result of the operation
          more(this._v1, this._v2);
      }
    }
    

    重要的是它只是使用 SetContinuation Step 方法(并且该方法知道它应该使用 _state 集合延续 有点像 btn.Click += Step

    C中的异步编程模型非常接近F异步工作流(事实上,除了一些技术细节外,本质上是相同的),并且使用 async 是一个很有趣的领域-至少我这么认为-例如 this article (也许我现在应该写一个C版:—))。

    生利 )事实上,可以使用迭代器在前面的C语言中实现异步编程。我写的 an article about that 前一段时间-我认为它仍然可以给你一些关于翻译工作的见解。

        2
  •  46
  •   Eric Lippert    14 年前

    如何在同一线程上并行执行操作?

    你不能。 异步不是“并行”或“并发”

    我的博客上有一系列关于这些东西是如何工作的文章;与这个问题有直接关系的一篇可能会在下周的周四发表。监视

    http://blogs.msdn.com/b/ericlippert/archive/tags/async/

    详细情况。

        3
  •  8
  •   Brian Rasmussen    14 年前

    据我所知 async await 异步 方法使用 等待 异步 方法以在异步部分完成后立即返回调用方并继续工作。

    根据现有的文件,有很多细节,但除非我弄错了,这就是要点。

    在我看来,异步方法的目的不是并行运行大量代码,而是将异步方法分割成许多小块,可以根据需要调用这些小块。关键是编译器将使用任务/连续性处理回调的所有复杂连接。这不仅降低了复杂性,而且允许异步方法的编写或多或少类似于传统的同步代码。