2017-02-26 79 views
0

我不明白我的代碼有什麼問題。我正在使用https://github.com/elcattivo/CloudFlareUtilities解決雲耀斑js。我想從頁面的數據,我使用此代碼:C#client.GetStringAsync(url)stuck

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) stucks。 Test1(url).Wait();也有問題。

我錯過了什麼嗎?

我只需要解決雲耀斑保護和從頁面獲取數據。我需要同步做到這一點。

+0

將'Test2'修改爲'async'。它會在您立即使用'Result'時同步運行。 – Venky

+0

@Venky我需要同步做到這一點。 –

+0

你沒有使用'await'。因此即使使用'async'關鍵字,您的代碼也可以同步運行。 – Venky

回答

3

您不應該在構造函數中調用async方法。你不應該阻止異步代碼。這可能導致死鎖。你可以閱讀更多關於此這裏:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

由於Test1async方法應該返回一個Task而不是無效:

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

然後,您可以await它一旦Form已由例如搬運裝該Shown事件Form的:

public Form1() 
{ 
    InitializeComponent(); 

    Shown += async (s, e) => 
    { 
     await Test1("https://SiteWithCloudFlareProtection.com/"); 
     //Thread.Sleep(60000); 
    }; 
} 

請參考以下ARTI有關C#中的異步編程的最佳實踐的更多信息,請參閱:https://msdn.microsoft.com/en-us/magazine/jj991977.aspx