使用元组任务时,我无法查看调试信息。例如。当他的命中断点时,我无法在悬停,本地窗口或监视窗口中查看任何变量。
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.
答案 0 :(得分:9)
这是当前版本的Visual Studio 2017中的一个错误。它已经修复,将在下一季度版本中发布。
请参阅MS员工的GitHub issue和comment,说明其已修复。
与此同时,来自GitHub对Apr 13, 2017的评论:
我可以使用ValueTuple 4.3.0确认错误,但不能使用4.3.0-preview1-24530-04。
您可以安装&#34;预览&#34;版本通过NuGet包管理器/管理NuGet包解决方案界面。只需从&#34;版本中选择4.3.0-preview1-24530-04
:&#34;下拉并点击&#34;安装&#34;。
有人希望,在Visual Studio的下一次更新之后,使用&#34;预览&#34;包的版本没有必要。正如前面提到的评论所指出的那样,为什么使用&#34;预览&#34;包的版本避免触发错误。但显然最好能够使用最新的&#34;稳定的&#34;如果可以的话,包的版本;谁知道自&#34;预览&#34;以来发生了什么变化?在调试器或其他方面会导致某些其他难以诊断的错误的版本。
答案 1 :(得分:1)
在观看窗口中看到错误后,我记得C#7中有一个新的ValueTask
。所以我添加了包system.threading.tasks.extensions
并将已损坏的方法更改为使用ValueTask
而不是Task
private static async ValueTask<(bool, bool)> TaskWithoutLocalDebugInfo()
{
var notViewableInLocalWindowAndHover = true;
return (notViewableInLocalWindowAndHover, notViewableInLocalWindowAndHover);
}
我现在可以看到调试信息。