我有控制台应用程序并执行获取流,这需要很长时间。我添加Wait()等待,但由于某些原因它不等待并立即关闭控制台应用程序。从我的udnerstanding Wait()应该阻止,直到任务完成。任何人都可以解释为什么它不会发生。 P.S我的网址获取流至少需要10秒,因此现在它的速度非常快。
class Program
{
static void Main(string[] args)
{
new Runner().Run().Wait();
}
}
public class Runner
{
public async Task Run()
{
var hc = new HttpClient();
await hc.GetStreamAsync("whateverURLwhichtakeslongtime");
}
}
答案 0 :(得分:1)
当我测试它时,代码似乎很好。
class Program
{
static void Main(string[] args)
{
System.Diagnostics.Debug.WriteLine("1");
new Runner().Run().Wait();
System.Diagnostics.Debug.WriteLine("4");
}
}
public class Runner
{
public async Task Run()
{
var hc = new HttpClient();
System.Diagnostics.Debug.WriteLine("2");
var result = await hc.GetStringAsync("http://www.google.com");
System.Diagnostics.Debug.WriteLine(result);
System.Diagnostics.Debug.WriteLine("3");
}
}
输出:
1
2
<!doctype html>......some long google page response
3
4
所以它实际上工作正常。
现在如果不清楚,请尝试使用Thread.Sleep(5000)//睡眠5秒钟 主要是肯定在等待
class Program
{
static void Main(string[] args)
{
System.Diagnostics.Debug.WriteLine("1");
new Runner().Run().Wait();
System.Diagnostics.Debug.WriteLine("4");
}
}
public class Runner
{
public async Task Run()
{
var hc = new HttpClient();
System.Diagnostics.Debug.WriteLine("2");
Thread.Sleep(5000);
System.Diagnostics.Debug.WriteLine("3");
}
}
输出:
1
2
...waiting 5 seconds
3
4
答案 1 :(得分:1)
最终,当你在一项不完整的任务上致电.Wait()
(或.Result
)时,所有投注都会被取消;这根本不是一个定义明确的场景。幸运的是,最近的C#版本包括async
对入口点的支持,所以:使用它!
static async Task Main(string[] args)
{
await new Runner().Run();
}
在这种情况下, 也可以简化为:
static Task Main(string[] args)
{
return new Runner().Run();
}