我在csharpstar.com上发现了这段代码,因为我试图了解有关async
和await
的更多信息。有人可以帮助我理解为什么当我调试它时,我到达await client.GetStringAsync ("http://www.CsharpStar.com");
分配给结果的行,然后调试器不会从try移动到下一行,也不会进入catch,它只是似乎从Main恢复执行?
如果await行抛出超时错误或者它应该不会捕获?
同样奇怪的是,当控制/流程恢复到Main时,它不会通过之前执行的ReadLine()行(在进入GetSite方法之前),但ReadLine()在退出GetSite方法后生效。
等待功能扰乱常规流量的解释是什么?为什么我不能调试下一行,所以我可以看到存储在结果变量中的值?
using System;
using System.Net.Http;
using System.Threading.Tasks;
using static System.Console;
namespace CSharpStar
{
class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(() => GetSite());
ReadLine(); // **...to here (2)**
}
private async static Task GetSite()
{
HttpClient client = new HttpClient();
try
{
var result = await client.GetStringAsync ("http://www.CsharpStar.com"); // **debugger jumps from here (1)**
WriteLine(result);
}
catch (Exception exception)
{
try
{
//This asynchronous request will be invoked if the first request is failed.
var result = await client.GetStringAsync ("http://www.easywcf.com");
WriteLine(result);
}
catch
{
WriteLine("Entered Catch Block");
}
finally
{
WriteLine("Entered Finally Block");
}
}
}
}
}
答案 0 :(得分:2)
不确定你正在读什么文章,但你应该就此止步。不建议Task.Factory.StartNew
,但Task.Run
是。{
发生的事情是,一旦达到Main
关键字,控件就会返回给调用者(在本例中为await
)。由于您await
未完成Task
,因此该计划将继续Console.WriteLine
行。这被称为 fire并忘记调用。
如果您要等待该功能完成,请将您的代码更改为:
static void Main(string[] args)
{
// change to the recommended Task.Run method
var task = Task.Run(() => GetSite());
task.GetAwaiter().GetResult(); // block until the Task is finished
ReadLine();
}