VS2017错误调试元组任务
VS2017 Error debugging Task of Tuple
我在使用元组任务时无法查看调试信息。例如。当断点命中时,我无法在悬停、本地 window 或手表 window.
中查看任何变量
重现只是新建一个WPF应用,添加System.ValueTuple,将这段代码添加到MainWindow.xaml.cs,然后在"return".[=12两行设置断点=]
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);
}
}
}
编辑:如果我将不可见的局部变量添加到 watch,我得到:error CS8182: Predefined type 'ValueTuple`2' must be a struct.
看到watch window的错误后,我想起了C# 7中有一个新的ValueTask
。所以我添加了package system.threading.tasks.extensions
并将损坏的方法更改为使用ValueTask
而不是 Task
private static async ValueTask<(bool, bool)> TaskWithoutLocalDebugInfo()
{
var notViewableInLocalWindowAndHover = true;
return (notViewableInLocalWindowAndHover, notViewableInLocalWindowAndHover);
}
我现在可以看到调试信息了。
这是Visual Studio2017当前版本的一个bug,已经修复,下个季度发布。
看到 MS 员工的 GitHub issue and the comment 说它已修复。
同时,来自 GitHub 对 Apr 13, 2017 的评论:
i can confirm that the bug repros with ValueTuple 4.3.0, but not with 4.3.0-preview1-24530-04.
您可以通过 NuGet Package Manager/Manage NuGet Packages for Solution 界面安装 "preview" 版本。只需从 "Version:" 下拉列表中选择 select 4.3.0-preview1-24530-04
,然后单击 "Install"。
希望在 Visual Studio 的下一次更新后,不再需要使用 "preview" 版本的软件包。正如前面提到的评论所指出的,不清楚为什么使用 "preview" 版本的包可以避免触发错误。但显然,如果可以的话,最好能够使用最新的 "stable" 版本的软件包;谁知道自 "preview" 版本以来发生了什么变化会导致一些 other 难以诊断的错误,在调试器或其他方面。
我在使用元组任务时无法查看调试信息。例如。当断点命中时,我无法在悬停、本地 window 或手表 window.
中查看任何变量重现只是新建一个WPF应用,添加System.ValueTuple,将这段代码添加到MainWindow.xaml.cs,然后在"return".[=12两行设置断点=]
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);
}
}
}
编辑:如果我将不可见的局部变量添加到 watch,我得到:error CS8182: Predefined type 'ValueTuple`2' must be a struct.
看到watch window的错误后,我想起了C# 7中有一个新的ValueTask
。所以我添加了package system.threading.tasks.extensions
并将损坏的方法更改为使用ValueTask
而不是 Task
private static async ValueTask<(bool, bool)> TaskWithoutLocalDebugInfo()
{
var notViewableInLocalWindowAndHover = true;
return (notViewableInLocalWindowAndHover, notViewableInLocalWindowAndHover);
}
我现在可以看到调试信息了。
这是Visual Studio2017当前版本的一个bug,已经修复,下个季度发布。
看到 MS 员工的 GitHub issue and the comment 说它已修复。
同时,来自 GitHub 对 Apr 13, 2017 的评论:
i can confirm that the bug repros with ValueTuple 4.3.0, but not with 4.3.0-preview1-24530-04.
您可以通过 NuGet Package Manager/Manage NuGet Packages for Solution 界面安装 "preview" 版本。只需从 "Version:" 下拉列表中选择 select 4.3.0-preview1-24530-04
,然后单击 "Install"。
希望在 Visual Studio 的下一次更新后,不再需要使用 "preview" 版本的软件包。正如前面提到的评论所指出的,不清楚为什么使用 "preview" 版本的包可以避免触发错误。但显然,如果可以的话,最好能够使用最新的 "stable" 版本的软件包;谁知道自 "preview" 版本以来发生了什么变化会导致一些 other 难以诊断的错误,在调试器或其他方面。