Вызов метода Async WebClient - PullRequest
       9

Вызов метода Async WebClient

0 голосов
/ 23 марта 2019

У меня есть следующий фрагмент кода:

public ActionResult DraftScores()
    {
// other code

var json = "";

var fixturesUrl = "someURL";


using (WebClient wc = new WebClient())
{
    wc.Headers.Add("X-Auth-Token", "7d594032xxxxxxxxxxxxxxxxxxxxx");
    json = wc.DownloadString(fixturesUrl);
}

var fixtureList = new JavaScriptSerializer().Deserialize<FixtureList>(json);

model.Matches = fixtureList.matches;

        return View(model);
    }

Я пытался извлечь это из его собственного асинхронного метода:

    private async Task<List<Match>> GetFixturesAsync()
    {
        var json = "";

        var fixturesUrl = "someURL";

        using (WebClient wc = new WebClient())
        {
            wc.Headers.Add("X-Auth-Token", "7d594032xxxxxxxxxxxxxxxxxxxxx");
            json =  await wc.DownloadStringTaskAsync(fixturesUrl);
        }

        var fixtureList = new JavaScriptSerializer().Deserialize<FixtureList>(json);

        return fixtureList.matches;
    }

код вызова:

public ActionResult DraftScores()
    {

//other code

var fixtures = GetFixturesAsync();

   //other code

    model.Matches = fixtures.Result;

        return View(model);
    }

В исходном коде вызов DownloadString выполняется примерно за 200 мс.Однако вызов DownloadStringTaskAsync все еще выполняется через несколько секунд.Что-то не так с тем, как я написал метод?

1 Ответ

2 голосов
/ 23 марта 2019

Чтобы правильно выполнить асинхронный ввод-вывод, вам нужна непрерывная цепочка ожидания от вашего контроллера до вызова DownloadStringTaskAsync ().

Шаг 1, выполните асинхронное действие.
Шаг 2, ожидайте асинхронностизвоните.

public async Task<ActionResult> DraftScores()
{
   ...
   List<Match> result = await GetFixturesAsync();
   ...
}

Всегда избегайте async void, .Result и .Wait()

...