2016-10-27 119 views
4

我需要一些幫助來找出我的問題。我已經使用了ASP.NET核心,並且我對此非常熟悉,儘管.NET核心C#在嘗試創建異步請求時似乎「崩潰」並退出。.NET核心的異步請求

我有一個返回系統

private async Task<string> getExternalIP() 
    { 
     using (System.Net.Http.HttpClient HC = new System.Net.Http.HttpClient()) 
     { 
      return await HC.GetStringAsync("https://api.ipify.org/"); 
     } 

    } 

這應該工作的外部IP的方法,但是當它到達HC.GetStringAsync退出。我也嘗試在它上面放置一個斷點,但它並沒有真正運行。

我試圖用

string Address = await getExternalIP(); 

任何幫助要調用的方法是感激,希望我不只是忽視的東西。

謝謝!

+0

你可能會得到一個例外。 – SLaks

+0

@SLaks我已重新啓用所有例外通知。沒有例外被拋出。 – Jaxi

+0

你使用'async void'嗎? – SLaks

回答

7

您提出的解決方案根本不好。

  1. 它是同步
  2. 它可能導致死鎖

作爲替代方案,嘗試這個辦法:

private async Task<string> GetExternalIP() 
{ 
    using (HttpClient client = new HttpClient()) 
     return await client.GetStringAsync("https://api.ipify.org/"); 
} 

你調用方法應該是異步太:

public async Task CallingMethod() 
{ 
    // ... 
    string address = await GetExternalIP(); 
    // ... 
} 

它之前沒有爲你工作的原因是由於使用async void而不是async Task(由評論猜測)造成的。

async void是一個不能等待的異步方法。這意味着,你只需要打電話並忘記它。你不會發現任何異常,你將不會得到任何回報價值。

async Task是一個等待異步的方法,不返回任何東西。它是void同步方法的異步對象。而且,由於它是可等待的,因此您還可以捕獲異步代碼中可能出現的異常。

+0

我原本有類似的東西,但問題是「CallingMethod」最終沒有返回,應用程序退出。沒有例外,沒有消息。 – Jaxi

+0

@ProNinjaCat因爲你正在使用'async void'而不是'async Task'。你還需要「從呼叫它的人」等待CallingMethod()。 –

+0

我有異步任務運行await getExternalIP()和getExternalIP()方法完全相同,但它仍然不會執行。 – Jaxi