[英]C# client.GetStringAsync(url) stucks
我不明白我的代码有什么问题。 我正在使用https://github.com/elcattivo/CloudFlareUtilities解决云耀斑js。 我正在尝试从页面获取数据,并且正在使用以下代码:
public Form1()
{
InitializeComponent();
Test1("https://SiteWithCloudFlareProtection.com/");
Thread.Sleep(60000);
}
async void Test1(string url)
{
HttpClient HttpClientWithoutCloudFlare = new HttpClient(new ClearanceHandler());
string json = await HttpClientWithoutCloudFlare.GetStringAsync(url).ConfigureAwait(false);
MessageBox.Show("Done");
}
void Test2(string url)
{
HttpClient HttpClientWithoutCloudFlare = new HttpClient(new ClearanceHandler());
string json = HttpClientWithoutCloudFlare.GetStringAsync(url).Result;
MessageBox.Show("Done");
}
没有Thread.Sleep(60000)
Test1
可以完美运行。 使用Thread.Sleep(60000)
Test1
卡住时, Test2
始终卡在命令GetStringAsync(url)
。 Test1(url).Wait();
也卡住了。
我想念什么吗?
我只需要解决云耀斑防护并从页面获取数据即可。 我需要同步进行。
您不应在构造函数中调用async
方法。 而且您不应该阻止异步代码。 这可能导致死锁。 您可以在此处阅读有关此内容的更多信息: http : //blog.stephencleary.com/2012/07/dont-block-on-async-code.html
由于Test1
是async
方法,因此它应该返回Task
而不是void:
async Task Test1(string url)
{
HttpClient HttpClientWithoutCloudFlare = new HttpClient(new ClearanceHandler());
string json = await HttpClientWithoutCloudFlare.GetStringAsync(url);
MessageBox.Show("Done");
}
然后,您可以在加载Form
后await
它,例如,处理Form
的Shown
事件:
public Form1()
{
InitializeComponent();
Shown += async (s, e) =>
{
await Test1("https://SiteWithCloudFlareProtection.com/");
//Thread.Sleep(60000);
};
}
请参考以下文章,以获取有关C#中异步编程的最佳实践的更多信息: https : //msdn.microsoft.com/zh-cn/magazine/jj991977.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.