69

.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>変換できません

どんな助けでも大歓迎です。

4

4 に答える 4

34

TestGetMethodasyncも作成する必要があり、の前に await をアタッチGetIdList();すると、タスクが にアンラップされList<int>ます。したがって、ヘルパー関数が Task を返す場合は、関数asyncも呼び出しているため、await があることを確認してください。

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>
}
于 2012-10-14T23:59:07.893 に答える
3

何をしようとしているかに応じて、GetIdList().Result でブロックするか (一般的には悪い考えですが、コンテキストを伝えるのは難しい)、非同期テスト メソッドをサポートするテスト フレームワークを使用してテスト メソッドに実行させることができます。 var results = await GetIdList();

于 2012-10-14T21:42:55.317 に答える