使用.NET Core进行异步请求

7

我需要一点帮助来找出我的问题。我使用了ASP.NET Core,对此我相当熟悉,尽管在尝试进行异步请求时,.NET Core C#似乎会"崩溃"并退出。

我有一个返回系统外部IP的方法。

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

    }

这应该是可以工作的,但它在到达 HC.GetStringAsync 时退出了。我也尝试在其上放置断点,但它实际上并未运行。

我正在尝试使用以下方法进行调用:

string Address = await getExternalIP();

任何帮助都将不胜感激,但愿我没有忽略什么。谢谢!

你可能会收到一个异常。 - SLaks
@SLaks 我已重新启用所有异常通知。没有任何异常被抛出。 - Sasha
你正在使用 async void 吗? - SLaks
哦,我错了。对不起 :) @ProNinjaCat - David W
你确定你的HttpClient已经成功实例化了吗? - David W
显示剩余10条评论
1个回答

12

你提出的解决方案根本不好。

  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 方法的异步对应方法。此外,由于它是可等待的,你也可以捕获可能在异步代码上升起的任何异常。


我最初有类似这样的东西,但问题是“CallingMethod”最终不返回,应用程序退出。没有异常,也没有消息。 - Sasha
@ProNinjaCat 因为你使用了 async void 而不是 async Task。你还需要从调用它的地方 await CallingMethod() - Matias Cicero
我有一个异步任务正在运行,等待执行 getExternalIP() 方法,而且 getExternalIP() 方法完全相同,但它仍然没有执行。 - Sasha
@ProNinjaCat,你也在等待 CallingMethod() 吗? - Matias Cicero
1
@ProNinjaCat 那就是为什么它从未运行。你从未等待它。如果你想要一个异步控制台应用程序,请参见这个问题 - mason
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接