等待后的代码不起作用

时间:2015-10-08 16:41:44

标签: c# asynchronous async-await

我有下一个代码:

  static void Main()
    {
        Program.DownloadFile();
        Console.ReadKey();
    }

    static async Task DownloadFile()
    {
        using(WebClient wc = new WebClient())
        {
            string address = "http://www.phantastike.com/link/astrology/predictive_astrology_a.zip";
            await wc.DownloadFileTaskAsync(address, "f.zip");
            // Here method returns
        }
        Console.WriteLine("This line not reached");
    }

当我启动它时,程序从未到达Console.WriteLine方法。它在等待之后返回。 但在下一个代码中,它运作良好:

 static void Main(string[] args)
    {
        Program.DownloadFile();
        Console.ReadKey();
    }

    static async Task DownloadFile()
    {
        await Task.Factory.StartNew(() => Task.Delay(2000));
        Console.WriteLine("Now you can see this message on console");
    }

谁可以解释一下?谢谢你,对不起我的英文

2 个答案:

答案 0 :(得分:4)

这可能发生:你不等待DownloadFile完成,控件返回Main,你到达Console.ReadKey,你按一个键,程序结束在它有机会完成下载之前。

当您使用await Task.Factory.StartNew(() => Task.Delay(2000));时,您并没有真正等待整整2秒,因为Task.Factory.StartNew会返回Task<Task>,因此会立即到达Console.WriteLine。您需要改为使用Task.Run

问题在于您没有等待您的操作完成。通常你会等待,但不能在Main中使用,所以在这种情况下使用Task.Wait

static void Main()
{
    DownloadFile().Wait();
}

答案 1 :(得分:0)

此处使用await没有任何问题。您应该监视您正在下载的文件的下载进度。添加DownloadProgressChanged

的事件处理程序
 using (WebClient wc = new WebClient())
   {
     wc.DownloadProgressChanged += wc_DownloadProgressChanged;
     string address = "http://www.ayobamiadewole.com/Blog/Files/AOP.zip";
     await wc.DownloadFileTaskAsync(address, "f.zip");
   }

 static void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
   { 
       Console.WriteLine("\r{0} % Completed.", e.ProgressPercentage);
   }