我正在尝试测试下面的http请求方法
public async Task<HttpContent> Get(string url)
{
using (HttpClient client = new HttpClient())
// breakpoint
using (HttpResponseMessage response = await client.GetAsync(url))
// can't reach anything below this point
using (HttpContent content = response.Content)
{
return content;
}
}
但是,调试器似乎跳过了第二个注释下面的代码。我正在使用Visual Studio 2015 RC,有什么想法吗?我也试着检查任务窗口,什么也没看到
编辑:找到解决方案
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace ConsoleTests
{
class Program
{
static void Main(string[] args)
{
Program program = new Program();
var content = program.Get(@"http://www.google.com");
Console.WriteLine("Program finished");
}
public async Task<HttpContent> Get(string url)
{
using (HttpClient client = new HttpClient())
using (HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false))
using (HttpContent content = response.Content)
{
return content;
}
}
}
}
事实证明,因为这是一个C#控制台应用程序,所以我猜它在主线程结束后结束,因为在添加控制台之后。ReadLine()并等待一段时间,请求确实返回了。我猜想C#会等到我的任务执行后才结束,但我想我错了。如果有人能详细说明为什么会发生这种情况,那就太好了。
当Main
退出时,程序退出。任何未完成的异步操作都将被取消,其结果将被丢弃。
因此,您需要阻止Main
退出,可以通过阻止异步操作,也可以通过其他方法(例如,调用Console.ReadKey
阻止,直到用户点击某个键):
static void Main(string[] args)
{
Program program = new Program();
var content = program.Get(@"http://www.google.com").Wait();
Console.WriteLine("Program finished");
}
一种常见的方法是定义一个执行异常处理的Main Async
:
static void Main(string[] args)
{
MainAsync().Wait();
}
static async Task MainAsync()
{
try
{
Program program = new Program();
var content = await program.Get(@"http://www.google.com");
Console.WriteLine("Program finished");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
注意,在异步代码上阻塞通常被认为是一个坏主意;很少有情况需要这样做,而控制台应用程序的Main
方法恰好就是其中之一。
我的程序需要允许用户输入员工姓名和年度总销售额。当用户完成将员工添加到阵列中时,程序应确定哪些员工的销售额最高,哪些员工的销售量最低。然后,它应该打印出两个数字之间的差异。 在我下面的代码中,我有一个保存用户输入的年销售额的totalPay类(它包括以前赋值中的其他变量和方法,这里没有使用)。salesPerson类保存雇员的姓名和totalPay对象,其中包括他们的年销售额。(我意识到这太复杂了
问题内容: 有时,当我调用Selenium FindElements(By)时,它将引发异常,并且驱动程序停止工作。参数“ BY”可能是问题所在:当我使用其他BY搜索相同的元素时,它起作用了。 我也可以看到,即使我的元素存在,或者之前曾调用过带有相同参数的相同方法,也不会阻止该方法引发异常。 我的方法是: 一个BY值的示例并非始终有效(即使它存在于页面中): 例外: WebDriverExcept
在以前版本的Visual Studio(或者我几年前设置的一些设置)中,当我停止调试Web应用程序时,实际的IIS Express实例将继续运行。我真的很喜欢这种行为,因为这意味着当我编辑代码/重新编译ect时,站点总是在运行以进行修补。 自从升级到VS 2013后,这种情况似乎不再发生,当我停止调试时,它也停止了IIS express应用程序池。 有没有人知道某处有没有改变这种行为的设定?
下面的代码有一个TaskMonitor类,它是Stephen Cleary的NotifyTask类的修改版本。Worker类使用TaskMonitor类异步运行Worker.CheckStatus。 Worker.CheckStatus经常会引发异常(例如数据库连接问题)。我希望TaskMonitor.Monitor阻止异常到达Program.Main并通过Exception和InnerExcep