等待函数未执行?

时间:2017-12-24 15:44:42

标签: c# asynchronous

我在csharpstar.com上发现了这段代码,因为我试图了解有关asyncawait的更多信息。有人可以帮助我理解为什么当我调试它时,我到达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");
                }
            }
        }
    }
}

1 个答案:

答案 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(); 
}