C# client.GetStringAsync(url) 卡住了
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
方法,它应该 return 一个 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/en-us/magazine/jj991977.aspx
我不明白我的代码有什么问题。我正在使用 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
方法,它应该 return 一个 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/en-us/magazine/jj991977.aspx