【问题标题】:VS2017 Error debugging Task of TupleTuple的VS2017错误调试任务
【发布时间】:2017-08-17 18:51:56
【问题描述】:

使用元组任务时,我无法查看调试信息。例如。当断点命中时,我无法在悬停时、本地窗口或监视窗口中查看任何变量。

repro 只是新建一个 WPF 应用,添加 System.ValueTuple,将此代码添加到 MainWindow.xaml.cs,然后在两行都用“return”设置断点。

using System.Threading.Tasks;
using System.Windows;

namespace WpfApp2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            var task1 = TaskWithLocalDebugInfo();
            var task2 = TaskWithoutLocalDebugInfo();
        }

        private async Task<bool> TaskWithLocalDebugInfo()
        {
            var viewableInLocalWindowAndHover = true;
            return viewableInLocalWindowAndHover;
        }

        private async Task<(bool, bool)> TaskWithoutLocalDebugInfo()
        {
            var notViewableInLocalWindowAndHover = true;
            return (notViewableInLocalWindowAndHover, notViewableInLocalWindowAndHover);
        }
    }
}

编辑:如果我添加不可查看的局部变量来观看,我会得到:error CS8182: Predefined type 'ValueTuple`2' must be a struct.

【问题讨论】:

  • 你没有在等待任何东西,所以无论如何你只会看到Task
  • 无论哪种方式都应该有效,但都没有
  • 在这个 sn-p 中我不关心返回值。我关心本地方法调试信息。
  • 我不知道你在说什么。如果我在带有返回值的行上放置一个断点,我应该能够悬停并查看 notViewableInLocalWindowAndHover 的值
  • 是的,这对我不起作用。您可以从我链接的仓库中尝试吗?

标签: c# visual-studio visual-studio-2017 c#-7.0


【解决方案1】:

这是 Visual Studio 2017 当前版本中的一个错误。它已得到修复,将在下一个季度发布。

查看 MS 员工的 GitHub issuecomment,表示已修复。

同时,来自Apr 13, 2017的GitHub评论:

我可以确认该错误在 ValueTuple 4.3.0 中重现,但在 4.3.0-preview1-24530-04 中没有重现。

您可以通过 NuGet Package Manager/Manage NuGet Packages for Solution 界面安装“预览”版本。只需从“版本:”下拉列表中选择4.3.0-preview1-24530-04,然后单击“安装”。

希望在下次更新 Visual Studio 之后,不再需要使用“预览”版本的包。正如前面提到的评论所指出的,尚不清楚为什么使用包的“预览”版本可以避免触发错误。但显然,如果可以的话,最好能够使用最新的“稳定”版本的软件包;谁知道自“预览”版本以来发生了什么变化,这会导致在调试器或其他地方出现一些其他难以诊断的错误。

【讨论】:

  • 注意:我刚刚安装了 15.2 更新,看来这已得到修复。无论我安装了哪些可用的 ValueTuple NuGet 包,非元组局部变量在调试器中都是可见的,即使存在元组变量也是如此。
【解决方案2】:

看到watch window的错误后,我想起了C# 7中有个新的​​ValueTask。所以我添加了包system.threading.tasks.extensions,并将损坏的方法改为使用ValueTask而不是Task

private static async ValueTask<(bool, bool)> TaskWithoutLocalDebugInfo()
{
    var notViewableInLocalWindowAndHover = true;
    return (notViewableInLocalWindowAndHover, notViewableInLocalWindowAndHover);
}

我现在可以看到调试信息了。

【讨论】:

  • 这不是问题的答案,而是一种解决方法:)
  • @DavidG 这是问题中所述问题的解决方法,因此绝对是一个答案。
猜你喜欢
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
相关资源
最近更新 更多