【问题标题】:Async requests with .NET core.NET 核心的异步请求
【发布时间】:2016-10-27 19:25:07
【问题描述】:

我需要一点帮助来找出我的问题。我使用过 ASP.NET 核心,对此我相当熟悉,尽管 .NET 核心 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 我已重新启用所有异常通知。没有抛出异常。
  • 你在用async void吗?
  • @SLaks 是调用它的方法

标签: c# .net console-application .net-core dotnet-httpclient


【解决方案1】:

您提出的解决方案一点也不好。

  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 引起的(由 cmets 猜测)。

async void 是无法等待的异步方法。这意味着,您只需调用它并忘记它。你不会捕获任何异常,也不会得到任何返回值。

async Task 是一个可等待的异步方法,它不返回任何内容。它是 void 同步方法的异步对应物。此外,由于它是可等待的,因此您还可以捕获异步代码中可能出现的任何异常。

【讨论】:

  • 我最初有类似的东西,但问题是“CallingMethod”最终没有返回并且应用程序退出。没有例外,没有消息。
  • @ProNinjaCat 因为您使用的是async void 而不是async Task。你还需要await CallingMethod()来自任何调用它的人。
  • 我有异步任务运行 await getExternalIP() 和 getExternalIP() 方法完全相同,但它仍然不执行。
  • @ProNinjaCat 你也在等CallingMethod()吗?
  • @ProNinjaCat 那么这就是它从未运行过的原因。你从来没有等过它。如果您需要异步控制台应用程序,请参阅this question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2017-08-16
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多