如果没有等待调用异步怎么办?

时间:2014-07-21 15:58:20

标签: .net async-await

我是否需要等待我在Azure客户端库中使用的异步调用

MyFunction()
{
  //break data load into blocks and upload individual block
  {
    BlockBlob.PutBlockAsync(blockIdBase64, 
      new MemoryStream(dataBytes, bytesRead, bytesPerChunk), 
      null);
  }

  // commit all the blocks to the blob
  BlockBlob.PutBlockListAsync(blocklist);
}

1 个答案:

答案 0 :(得分:1)

你不需要等待他们,不。这实际上是使它们异步的原因。在堆栈的某个时刻,某些东西需要调用异步操作而等待它以使其中的任何一个异步。

代码将同步执行,直到它到达方法本身中的异步操作。此时,系统会将async方法的其余部分放在ContinueWith()中,并将控制权返回给您的调用代码。

否则,你会看到一个“火灾和遗忘”的情况,你永远不会知道是否出了什么问题。这可以很简单:

BlockBlob.PutBlockListAsync(blocklist).ContinueWith(t => {
    // t is the returned Task.  Check it for errors, respond to its state, etc.
});

旁注:这正是应该避免async void的原因。它不会返回Task,因此无法像这样处理。