如何调试异步代码?

8
我一直在尝试制作一个简单的应用程序,可以将YouTube网址列表下载为MP3文件,并将它们保存到指定的文件夹中。然而,它并没有下载这些文件。(我曾经做得还不错,但我猜这个夏天缺乏练习已经毁了它)
首先,看一下代码:https://gist.github.com/ericBG/159debbcdb606647afb8(我知道它不是最小的,但它相当小,我也不确定问题出在哪里)
所以,发生的情况是,它应该有一些输出,类似于:
Enter folder path where you would like output .mp3 files to be saved:
G:\MusicTemp
Enter any youtube videos you would like downloaded:
https://www.youtube.com/watch?v=N6eUF30HXWY
API requested for http://youtube.com/watch?v=N6eUF30HXWY
Downloading API response for http://youtube.com/watch?v=N6eUF30HXWY
Song requested for http://youtube.com/watch?v=N6eUF30HXWY
Completed download.
Enter any youtube videos you would like downloaded:

(这个视频只是我轻松找到的最短视频) 并且文件下载为“视频标题”.mp3,存储在路径中。

然而,发生的情况是这样的:

Enter folder path where you would like output .mp3 files to be saved:
G:\MusicTemp
Enter any youtube videos you would like downloaded:
https://www.youtube.com/watch?v=N6eUF30HXWY
API requested for http://youtube.com/watch?v=N6eUF30HXWY
Downloading API response for http://youtube.com/watch?v=N6eUF30HXWY
Completed download.
Enter any youtube videos you would like downloaded:

并且文件不在路径中。

我有一种感觉,这可能是由于我的某些异步编程引起的。然而,我不确定如何调试这个问题,因为我不知道哪些工具可以让我逐步执行并查看我出了什么问题,然后进行更正。VS Community调试器能够很好地帮我调试这段代码吗?谢谢!


你有收到任何异常吗?你对该目录有写入权限吗? - Arghya C
你是如何创建现有的代码的?你使用了哪个IDE? - Sebastian Schumann
@ArghyaC 没有例外,只是代码的一部分被跳过了。我肯定对该目录具有写权限。 - It'sNotALie.
1
@Verarind 我想请教一下如何调试异步代码,因为我不太了解该如何做。我知道VS Community 2015有一个调试器。 - It'sNotALie.
3
@It'sNotALie。您可以像调试普通代码一样对其进行调试。设置断点,使用单步跳入或单步跳过并浏览代码。如果您有多个线程,那么由于调试器会跳转到另一个线程,可能会很麻烦。如果您只想调试一个线程,请转到线程窗口(调试/窗口/线程),找到当前线程(黄色箭头)并冻结所有其他线程。 - Sebastian Schumann
显示剩余7条评论
2个回答

11

将评论复制一份,因为这是问题的答案(不是代码问题的解决方案):

您可以像普通代码一样进行调试。设置断点,使用步骤进入或步骤跳过并浏览代码。如果您有多个线程,可能会很痛苦,因为调试器会从一个线程跳到另一个线程。如果您只想调试一个线程,请转到线程窗口(调试/窗口/线程),找到当前线程(黄色箭头)并冻结所有其他线程。


1
很可能在保存或下载文件时出现了错误,但您没有进行检查。
代码如下:
.ContinueWith(t => Console.WriteLine("Completed download.")));

应该检查先前的任务是否有错误。
.ContinueWith(t => 
              {
                 if(t.Exception != null)
                 {
                    // log error
                 }
                 else
                 {
                    Console.WriteLine("Completed download.")));
                 });

添加到列表中的外部任务表示继续完成,因此即使下载失败也将成功。

这看起来像是程序存在的问题的解决方案。问题是如何进行调试。 - Sebastian Schumann
它有一个异常。谢谢! - It'sNotALie.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接