Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#client.GetStringAsync(url)stuck_C#_Multithreading_Dotnet Httpclient - Fatal编程技术网

C#client.GetStringAsync(url)stuck

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

我不明白我的代码出了什么问题。我正在使用来解决CloudFlare 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");
}
没有
线程。睡眠(60000)
Test1
工作正常。使用
Thread.Sleep(60000)
Test1
stucks,
Test2
始终在命令中stucks
GetStringAsync(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();斯图克也是。