我有下一个代码:
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");
}
谁可以解释一下?谢谢你,对不起我的英文
答案 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);
}