2016-10-27 73 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