【问题标题】:Debugger not stepping over/into async/wait调试器没有跨步/进入异步/等待
【发布时间】:2020-10-10 02:14:17
【问题描述】:

我正在单独测试一些代码,它运行得很好——调试器会逐行遍历并返回预期的结果。以下是我正在单独测试的一些代码:

static async Task<List<string>> GetExclusionDataAsync(Uri blobUri)
{
       var listOfExclusions = new List<string>();

       var blobDownloadInfo = await StreamBlobData(blobUri);

       using (StreamReader reader = new StreamReader(blobDownloadInfo.Content))
       {
             while (!reader.EndOfStream)
             {
                 string exclusionRow = reader.ReadLine();
                 listOfExclusions.Add(exclusionRow);
              }
        }
       return listOfExclusions;
}

private static async Task<BlobDownloadInfo> StreamBlobData(Uri blobPathUri)
{
      BlobClient blobClient = new BlobClient(blobPathUri);
      BlobDownloadInfo blobDownloadInfo = await blobClient.DownloadAsync();
      return blobDownloadInfo;
}

我已经将这个测试代码(几乎)完全复制到另一个更大的开发者中。解决方案。当我在BlobClient blobClient = new BlobClient(blobPathUri); 行上设置断点、调试并尝试跳过/进入该行时,调试器会跳过方法中的其余代码,并在没有预期数据的情况下跳回到先前的方法。见下文:

调试器从第 75 行开始。

然后我跳过/进入,调试器跳到第 60 行(调用方法),没有数据。

我该如何解决这个问题/发生了什么?

我不熟悉异步编程和从 blob 存储中检索内容。提前致谢!

【问题讨论】:

  • 它没有跳到那一行,它没有执行超过那一行。所以呼叫尚未等待,因此线路本身是黄色的。如果它没有数据返回,下一行将是黄色的。在您的隔离项目中,您调用显然是同步完成的,这是允许的。从技术上讲,异步函数确实会在其第一个不完整的await 处返回给调用者,然后调用者的await 等待它。
  • 查看 Visual Studio 的工具栏。回跳时,“线程”号会变吗?
  • @GabrielLuci 你指的是VS>debug>windows>threads吗?我想这就是你所指的。当我在调试时打开此窗口并逐步执行如上所示的代码时,线程数似乎在我逐步执行时随机增加或减少。我尝试了大约 10 次,最终结果是线程数有时会上升有时会下降。我很困惑。
  • 当然,那个窗口也可以。该窗口中将有一个黄色箭头,显示您当前正在调试的线程。我想知道它是否跳到另一个线程。
  • @JustinFeistner,请为您的问题添加答案:)。

标签: c# debugging async-await azure-blob-storage


【解决方案1】:

我正在添加答案以关闭此问题。

要进入/结束,您需要将包 azure.storage.blobs 安装到您的调用项目中,所以它只是参考相关的。然后在调试期间,您可以进入/越过它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2015-09-28
    • 1970-01-01
    • 2023-03-12
    • 2021-06-30
    • 2017-03-31
    相关资源
    最近更新 更多