繁体   English   中英

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

由于Test1async方法,因此它应该返回Task而不是void:

async Task Test1(string url)
{
    HttpClient HttpClientWithoutCloudFlare = new HttpClient(new ClearanceHandler());
    string json = await HttpClientWithoutCloudFlare.GetStringAsync(url);
    MessageBox.Show("Done");
}

然后,您可以在加载Formawait它,例如,处理FormShown事件:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM