5

新しい Windows Phone 8 アプリに取り組んでいます。有効な json データを返す Web サービスに接続しています。longlistselector を使用してデータを表示しています。GetAccountList(); で文字列 json を使用している場合、これは正常に機能します。しかし、DataServices クラスからデータを受信すると、「型 'System.Threading.Tasks.Task' を文字列に暗黙的に変換できません」というエラーが表示されます。何がうまくいかないのかわからない。どんな助けでも大歓迎です。ありがとう!

DataServices.cs

    public async static Task<string> GetRequest(string url)
    {
        HttpClient httpClient = new HttpClient();

        await Task.Delay(250);

        HttpResponseMessage response = await httpClient.GetAsync(url);
        response.EnsureSuccessStatusCode();
        string responseBody = await response.Content.ReadAsStringAsync();
        Debug.WriteLine(responseBody);
        return await Task.Run(() => responseBody);
    }

AccountViewModel.cs

 public static List<AccountModel> GetAccountList()
    {
        string json = DataService.GetRequest(url);
        //string json = @"{'accounts': [{'id': 1,'created': '2013-10-03T16:17:13+0200','name': 'account1 - test'},{'id': 2,'created': '2013-10-03T16:18:08+0200','name': 'account2'},{'id': 3,'created': '2013-10-04T13:23:23+0200','name': 'account3'}]}";
        List<AccountModel> accountList = new List<AccountModel>();

        var deserialized = JsonConvert.DeserializeObject<IDictionary<string, JArray>>(json);

        JArray recordList = deserialized["accounts"];


        foreach (JObject record in recordList)
        {
            accountList.Add(new AccountModel(record["name"].ToString(), record["id"].ToString()));
        }

        return accountList;
    }

更新:私はそれを少し変更し、今では魅力のように動作します。ご協力いただきありがとうございます!DataServices.cs

     //GET REQUEST
    public async static Task<string> GetAsync(string url)
    {
        var httpClient = new HttpClient();

        var response = await httpClient.GetAsync(url);

        string content = await response.Content.ReadAsStringAsync();

        return content;
    }

AccountViewModel.cs

    public async void LoadData()
    {
        this.Json = await DataService.GetAsync(url);
        this.Accounts = GetAccounts(Json);
        this.AccountList = GetAccountList(Accounts);
        this.IsDataLoaded = true;
    }

    public static IList<AccountModel> GetAccounts(string json)
    {
        dynamic context = JObject.Parse(json);

        JArray deserialized = (JArray)JsonConvert.DeserializeObject(context.results.ToString());

        IList<AccountModel> accounts = deserialized.ToObject<IList<AccountModel>>();

        return accounts;
    }

    public static List<AlphaKeyGroup<AccountModel>> GetAccountList(IList<AccountModel> Accounts)
    {
        List<AlphaKeyGroup<AccountModel>> accountList = AlphaKeyGroup<AccountModel>.CreateGroups(Accounts,
                System.Threading.Thread.CurrentThread.CurrentUICulture,
                (AccountModel s) => { return s.Name; }, true);

        return accountList;
    }
4

2 に答える 2

1

その行はあなたの問題です:

return await Task.Run(() => responseBody);

あなたはそれを試しましたか?:

return responseBody;

これも試してください:

public async static List<AccountModel> GetAccountList()
{
    string json = await DataService.GetRequest(url);
    ...
}
于 2013-10-19T17:30:50.803 に答える
0

ここでいくつかのこと。まずエラー

タイプ 'System.Threading.Tasks.Task' を文字列に暗黙的に変換できません このエラーは への呼び出しから発生していますDataService.GetRequest(url)。このメソッドは文字列を返します。Tt はTaskを返します。T は文字列です。このメソッドの結果を使用できる方法は多数あります。最初の (そして最良/最新の) 方法は、メソッドの呼び出しを待機することです。

string json = await DataService.GetResult(url);

この変更を行うにはasync、メソッドにキーボードを追加する必要があります

public async static List<AccountModel> GetAccountList()

これは新しい async/await パターンです。これらの単語を追加すると、メソッド cal が非同期であることをコンパイラに伝えます。非同期呼び出しを行うことができますが、同期であるかのようにコードを記述できます。メソッドを呼び出す他の方法は、Task オブジェクトを直接操作することです。

// First is to use the Result property of the Task
// This is not recommended as it makes the call synchronous, and ties up the UI thread
string json = DataService.GetResult(url).Result;

// Next is to continue work after the Task completes.
DataService.GetResult(url).ContinueWith(t =>
{
    string json = t.Result;
    // other code here.
};

次に、GetResult メソッドについて説明します。async/await パターンを使用するには、メソッドから Task を返す必要があります。戻り値の型が Task であっても、コードは T を返す必要があります。Krekkon が述べたように、戻り行を次のように変更する必要があります。

return responseBody;

これは、非同期メソッドから Task を返すことに関するすばらしい記事です。

于 2013-10-20T21:15:01.067 に答える