Использовать веб-службу в C#: удалить Task.Wait () - PullRequest
2 голосов
/ 13 июля 2020

Я пытаюсь использовать веб-службу. Это услуга на основе XML. Я имею в виду ответ в формате XML. Код работает нормально. Однако я не хочу использовать task.Wait (). Пожалуйста, дайте мне знать, как я могу заменить его на async / await.

Ниже мой код:

using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace ConsoleApp6
{
class Program
{
    static void Main(string[] args)
    {
        Program obj = new Program();
        var result = obj.GetData().Result;
    }

    public async Task<string> GetData()
    {
        string url =
            "https://test.net/info.php?akey=abcd&skey=xyz";
        HttpClient client = new HttpClient();
        HttpResponseMessage response = client.GetAsync(url).Result;
        var responseValue = string.Empty;
        if (response != null)
        {


            Task task = response.Content.ReadAsStreamAsync().ContinueWith(t =>
            {
                var stream = t.Result;
                using (var reader = new StreamReader(stream))
                {
                    responseValue = reader.ReadToEnd();
                }
            });

            task.Wait(); // How I can replace it and use await


        }

        return responseValue;
    }
}

[XmlRoot(ElementName = "Info")]
public class Test
{
    [XmlAttribute(AttributeName = "att")]
    public string SomeAttribute{ get; set; }
    [XmlText]
    public string SomeText{ get; set; }
}

}

Ответы [ 2 ]

5 голосов
/ 13 июля 2020

Вы уже находитесь в контексте async, поэтому просто используйте await:

var stream = await response.Content.ReadAsStreamAsync();

using (var reader = new StreamReader(stream))
{
    responseValue = reader.ReadToEnd();
}
       

Тем не менее, вы должны проверить все свои вызовы:

HttpResponseMessage response = await client.GetAsync(url);

и сделать ваш main asyn c тоже, и пока мы на нем, сделайте метод stati c:

public static async Task Main)
{
    var result = await GetData();
}

, где подпись вашего метода:

public static async Task<string> GetData()

The static не требуется, но вы обнаружите, что параллельное и / или асинхронное программирование намного проще, если у вас как можно меньше побочных эффектов.

2 голосов
/ 13 июля 2020

Вы также можете использовать Main метод async и await GetData

static async Task Main(string[] args)
{
    Program obj = new Program();
    var result = await obj.GetData();
}
...