【问题标题】:C# HttpClient return Status WaitingForActivationC# HttpClient 返回状态 WaitingForActivation
【发布时间】:2020-08-04 03:14:27
【问题描述】:

我只有一种 Api Request 方法如下

private async Task<Site> getSiteAsync(string siteId)
{
    Site site = null;
    var response = await httpClient.SendAsync( 
        new HttpRequestMessage(HttpMethod.Get, httpClient.BaseAddress + $"api/sites/{siteId}"));
    if (response.IsSuccessStatusCode)
    {
        var stream = await response.Content.ReadAsStreamAsync();
        site = await JsonSerializer.DeserializeAsync<Site>(stream, serializerOptions);
    }
    return site;
}

当我尝试从我的 MainClass 调用它时,第一个调用 (a) 工作正常,但 b、c 和 d 它们都返回给我Status = WaitingForActivation

private readonly HttpClient httpClient = new HttpClient();
private readonly JsonSerializerOptions serializerOptions = new JsonSerializerOptions();

public MainWindow()
{
    httpClient.BaseAddress = new Uri($"http://localhost:5000/MyApi/");
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
    serializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

    var a = getSiteAsync("0001"); << I only get the value of this call.
    var b = getSiteAsync("0002");
    var c = getSiteAsync("0003");
    var d = getSiteAsync("0004");
    InitializeComponent(); 
}

我怎样才能得到 b,c 和 d 的结果?

【问题讨论】:

  • 你应该等待电话。
  • @mm8 怎么样? ,我不能让我的 Constructor(MainWindow) 成为异步方法。有没有办法做到这一点?
  • 您可以例如处理Loaded 事件。例如,请参阅我的答案。

标签: c# wpf .net-core async-await asp.net-core-webapi


【解决方案1】:

您应该等待调用,因为您只能在 async 方法中而不是在构造函数中执行此操作,您应该将代码移动到方法或事件处理程序:

public MainWindow()
{
    httpClient.BaseAddress = new Uri($"http://localhost:5000/MyApi/");
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
    serializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

    Loaded += async (s, e) =>
    {
        var a = await getSiteAsync("0001");
        var b = await getSiteAsync("0002");
        var c = await getSiteAsync("0003");
        var d = await getSiteAsync("0004");
    };

    InitializeComponent();
}

【讨论】:

    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2019-12-28
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多