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 它,例如处理 FormShown 事件:

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