当我使用 ReadAsStringAsync() 时,如何避免将我的方法设置为异步

本文关键字:我的 何避免 方法 设置 异步 ReadAsStringAsync | 更新日期: 2023-09-27 18:32:33

我正在开发一个带有C#和.NET Framework 4.0的库。

我有这种方法可以在 ASP.NET Web Api 2 Web服务上放置一些东西。

public async Task<string> PrepareAndStartv2(
    string orderNumber,
    string userName,
    string systemName)
{
    string uri =
        string.Format(PrepareAndStartUri, orderNumber, userName, systemName);
    string batchName = null;
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(webApiHost);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        HttpContent content = new StringContent(string.Empty, Encoding.UTF8, "application/json");
        Task<HttpResponseMessage> response = client.PutAsync(uri, content);
        HttpResponseMessage message = response.Result;
        Task<string> task = message.Content.ReadAsStringAsync();
        batchName = await task;
    }
    return batchName;
}

我添加了message.Content.ReadAsStringAsync()以获取该方法返回的字符串。在那之后,我被迫到处Task<string>awaitasync

有没有另一种选择可以在不使用awaitTask<string>async的情况下读取HttpContent中的字符串?

也许在这个等待的PrepareAndStartv2方法中运行任务,我会用ReadAsStringAsync()读取字符串。

当我使用 ReadAsStringAsync() 时,如何避免将我的方法设置为异步

您可以在调用异步方法后使用 Task.Result 来避免您自己的方法被强制异步:

public string PrepareAndStartv2(
    string orderNumber,
    string userName,
    string systemName)
{
    string uri =
        string.Format(PrepareAndStartUri, orderNumber, userName, systemName);
    string batchName = null;
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(webApiHost);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        HttpContent content = new StringContent(string.Empty, Encoding.UTF8, "application/json");
        HttpResponseMessage message = client.PutAsync(uri, content).Result;
        batchName = message.Content.ReadAsStringAsync().Result;
    }
    return batchName;
}