并行堆栈-Visual Studio博客 https://devblogs.microsoft.com/visualstudio/tag/parallel-stacks/ Visual Studio工程团队产品洞察力的官方来源 2020年6月23日星期二18:11:44+0000 英语-美国 每小时 1 https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/10/microsoft-Favicon.png 并行堆栈-Visual Studio博客 https://devblogs.microsoft.com/visualstudio/tag/parallel-stacks/ 32 32 调试异步代码:任务的并行堆栈 https://devblogs.microsoft.com/visualstudio/debugging-async-code-parallel-stacks-for-tasks网站/ https://devblogs.microsoft.com/visualstudio/debugging-async-code-parallel-stacks-for-tasks/#comments 2020年6月15日星期一16:00:37+0000 https://devblogs.microsoft.com/visualstudio/?p=229670 想要直观地描述异步代码在visual Studio中的执行方式吗?查看最新更新的“任务并行堆栈”窗口!

帖子调试异步代码:任务的并行堆栈首次出现于Visual Studio博客

]]>
上次异步调试博客帖子,我们在Visual Studio中探索了一些工具来帮助您调试异步代码。我们讨论的工具之一是并行堆栈窗口对于Tasks(或Parallel Tasks),在调试时提供任务和线程信息的工具。与表格不同任务螺纹窗口中,此信息以图形方式显示,显示线程和任务之间的关系,就像调用堆栈的说明性版本。在最新版本的Visual Studio中,我们对的“并行任务”窗口进行了一些重大改进。NET应用程序,所以让我们深入了解更新的功能!

我们将用于演示并行任务工具的代码可以在以下位置找到这篇关于异步调试工具的深入Microsoft文档演练

 

为什么使用并行堆栈窗口中的任务视图?

中异步编程的“魔力”。NET既可以是福也可以是祸。添加了任务类型,异步,等待英寸。NET提供了额外的抽象层,这使您能够编写响应性应用程序,但也使您在调试时更难浏览和理解每个等待或活动任务的状态。“并行堆栈”窗口(Debug>Windows>Parallel Stacks,选择“Tasks”下拉菜单)是一种很好的方法,可以帮助您可视化并更好地导航异步代码的执行。

通常在完成另一段代码后,将异步代码分解为调度的块。“并行堆栈”窗口中的“线程”视图可以告诉您代码块何时未在线程上运行。然而,与Tasks视图不同,它无法帮助您确定为什么代码块没有运行。

基本并行任务窗口示例
图1:基本并行任务窗口示例

 

等待的Task和计划在其不共享直接调用方-被调用方关系(例如线程上的调用堆栈)后运行的代码。相反,他们有一种“逻辑”关系。这是每段代码了解下一个调度块的地方,从而创建一个“逻辑堆栈”。图2显示了三个任务在程序开始时共享调用堆栈,从而共享同一个框。

如果异步方法是“活动的”(即在线程上运行),这些逻辑堆栈有时会显示在“线程”视图中。但是,Tasks视图将显示活动和等待的逻辑堆栈。这有助于调试挂起或找出特定任务或代码块未运行的原因。

图2:并行堆栈窗口-任务视图
图2:并行堆栈窗口–任务视图

 

新的并行任务窗口如何结构化的?

在任何给定的程序状态下,共享相同逻辑调用堆栈的任务都被分组到框/节点中。这些节点揭示了有多少任务在分支到不同的功能之前正在执行相同的操作。因此,这种分组可以更清楚地描述整个程序的状态。

默认情况下,Parallel Tasks显示任务进展的自上而下显示,从最近的函数调用分支到初始调用方。使用“并行任务”窗口工具栏中的反向布局按钮可以自下而上显示任务进度。此反向布局显示了从初始调用者到最近函数调用的任务分支。在图3中,三个任务从函数S.C分支到三个不同的调用堆栈,它们最近的调用分别是S.R、S.O和S.M。

任务视图自下而上布局
图3:任务视图自下而上布局

 

并行任务窗口中还有什么新功能?

将鼠标悬停在窗口中的每一行上,查看该方法中当前所有任务的表格表示。与Task Window类似,此表允许您查看每个Task的状态、ID、持续时间和更具体的信息。现在,选择一个任务会将您定向到其相应的异步调用堆栈。您可以使用此调用堆栈导航到相关代码并检查异步方法中的局部变量。

将鼠标悬停在“并行堆栈”窗口中的任务上
图4:将鼠标悬停在Parallel Stacks窗口中的任务上

 

访问任务的异步调用堆栈
图5:访问任务的异步调用堆栈

 

对于多线程应用程序,您可能希望在特定任务和运行该任务的线程之间导航。现在,您可以通过上下文菜单在tasks View中的任务和threads View中相应的线程之间快速切换。

在并行堆栈中的线程和任务之间交换
图6:并行堆栈中线程和任务之间的交换

 

您还将收到有关任务等待特定线程拥有的锁或等待特定异步操作完成的线程的通知。发生这种情况时,可以双击通知直接导航到该线程或任务。

最后,您可以使用窗口工具栏中的保存图标将“并行堆栈”窗口内容保存为PNG文件。

平行堆栈保存图标
图7:平行堆栈保存图标

 

准备好在调试异步代码时尝试新的和改进的并行任务窗口了吗?给我们您的反馈!

在这个工具的未来版本中,我们仍然可以做很多改进。您的反馈将帮助我们做到这一点!如果您想分享使用改进的Parallel Stacks工具或调试异步代码的经验,请完成此调查

帖子调试异步代码:任务的并行堆栈首次出现于Visual Studio博客

]]>
https://devblogs.microsoft.com/visualstudio/debugging-async-code-paralle-stacks-for-tasks/feed/ 2