Подтвердить что ты не робот

Невозможно неявно преобразовать тип из Task <>

Я пытаюсь освоить синтаксис метода aync в .NET 4.5. Я думал, что я понял примеры точно, независимо от того, какой тип метода асинхронный (т.е. Task<T>), я всегда получаю тот же тип ошибки при преобразовании обратно в T - который я понял в значительной степени автоматический. Следующий код вызывает ошибку:

Невозможно неявно преобразовать тип 'System.Threading.Tasks.Task<System.Collections.Generic.List<int>>' в 'System.Collections.Generic.List<int>'

public List<int> TestGetMethod()
{
    return GetIdList(); // compiler error on this line
}


async Task<List<int>> GetIdList()
{
    using (HttpClient proxy = new HttpClient())
    {
        string response = await proxy.GetStringAsync("www.test.com");
        List<int> idList = JsonConvert.DeserializeObject<List<int>>();
        return idList;
    }
}

Это не удается, если я также явно передал результат. Это:

public List<int> TestGetMethod()
{
    return (List<int>)GetIdList();  // compiler error on this line
}

несколько предсказуемо приводит к этой ошибке:

Невозможно преобразовать тип 'System.Threading.Tasks.Task<System.Collections.Generic.List<int>>' в 'System.Collections.Generic.List<int>'

Любая помощь очень ценится.

4b9b3361

Ответ 1

Основная проблема с вашим примером в том, что вы не можете неявно преобразовывать типы возвращаемых типов Task<T> в базовый тип T. Вам нужно использовать свойство Task.Result. Обратите внимание, что Task.Result будет блокировать асинхронный код и его следует использовать осторожно.

Попробуйте это вместо:

public List<int> TestGetMethod()  
{  
    return GetIdList().Result;  
}

Ответ 2

Вам нужно также сделать TestGetMethod async и приложить ожидающий перед GetIdList();, чтобы развернуть задачу до List<int>, поэтому, если ваша вспомогательная функция возвращается. Задайте, чтобы вы ожидали, когда вы вызываете функцию async.

public Task<List<int>> TestGetMethod()
{
    return GetIdList();
}    

async Task<List<int>> GetIdList()
{
    using (HttpClient proxy = new HttpClient())
    {
        string response = await proxy.GetStringAsync("www.test.com");
        List<int> idList = JsonConvert.DeserializeObject<List<int>>();
        return idList;
    }
}

Другой вариант

public async void TestGetMethod(List<int> results)
{
    results = await GetIdList(); // await will unwrap the List<int>
}

Ответ 3

В зависимости от того, что вы пытаетесь сделать, вы можете заблокировать GetIdList(). Результат (как правило, плохая идея, но трудно сказать контекст) или использовать тестовую среду, поддерживающую методы асинхронного тестирования, и метод test do var results = ожидание GetIdList();