C#client.GetStringAsync(url)stuck
我不明白我的代码出了什么问题。我正在使用来解决CloudFlare js。我正在尝试从页面获取数据,我正在使用以下代码:C#client.GetStringAsync(url)stuck,c#,multithreading,dotnet-httpclient,C#,Multithreading,Dotnet Httpclient,我不明白我的代码出了什么问题。我正在使用来解决CloudFlare js。我正在尝试从页面获取数据,我正在使用以下代码: public Form1() { InitializeComponent(); Test1("https://SiteWithCloudFlareProtection.com/"); Thread.Sleep(60000); } async void Test1(string url) { HttpClient HttpClientWitho
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");
}
没有线程。睡眠(60000)
Test1
工作正常。使用Thread.Sleep(60000)
Test1
stucks,Test2
始终在命令中stucksGetStringAsync(url)
。
Test1(url.Wait()代码>stucks也一样
我错过什么了吗
我只需要解决云flare保护问题,并从页面获取数据。我需要同步执行。您不应该在构造函数中调用async
方法。您不应该阻塞异步代码。这可能导致死锁。您可以在此处阅读更多关于此的信息:
由于Test1
是一个async
方法,它应该返回一个Task
而不是void:
async Task Test1(string url)
{
HttpClient HttpClientWithoutCloudFlare = new HttpClient(new ClearanceHandler());
string json = await HttpClientWithoutCloudFlare.GetStringAsync(url);
MessageBox.Show("Done");
}
然后,您可以通过处理表单
的事件等表单加载后等待它:
public Form1()
{
InitializeComponent();
Shown += async (s, e) =>
{
await Test1("https://SiteWithCloudFlareProtection.com/");
//Thread.Sleep(60000);
};
}
有关C#中异步编程的最佳实践的更多信息,请参阅以下文章:您不应该在构造函数中调用async
方法。您不应该阻塞异步代码。这可能导致死锁。您可以在此处阅读更多关于此的信息:
由于Test1
是一个async
方法,它应该返回一个Task
而不是void:
async Task Test1(string url)
{
HttpClient HttpClientWithoutCloudFlare = new HttpClient(new ClearanceHandler());
string json = await HttpClientWithoutCloudFlare.GetStringAsync(url);
MessageBox.Show("Done");
}
然后,您可以通过处理表单
的事件等表单加载后等待它:
public Form1()
{
InitializeComponent();
Shown += async (s, e) =>
{
await Test1("https://SiteWithCloudFlareProtection.com/");
//Thread.Sleep(60000);
};
}
有关C#中异步编程的最佳实践的更多信息,请参阅以下文章:将Test2
修改为async
。当您使用Result
时,它会立即同步运行。@Venky我需要同步运行。您没有使用wait
。因此,即使您使用async
关键字,您的代码也会同步运行。您确定方法被卡住了吗?也许您应该等待响应一段时间(由于同步调用)。@venkytest1是异步的,使用wait。Test1(url.Wait();也检查。将Test2
修改为async
。当您使用Result
时,它会立即同步运行。@Venky我需要同步运行。您没有使用wait
。因此,即使您使用async
关键字,您的代码也会同步运行。您确定方法被卡住了吗?也许您应该等待响应一段时间(由于同步调用)。@venkytest1是异步的,使用wait。Test1(url.Wait();斯图克也是。