0

私は次の機能を持っています:

private void getAllData()
    {
        HttpWebRequest request = HttpWebRequest.CreateHttp("http://webservice.com/wfwe");
        request.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), request);
    }
        void GetResponsetStreamCallback(IAsyncResult callbackResult)
    {
        HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState;
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
        using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()))
        {
            string result = httpWebStreamReader.ReadToEnd();
            GetApplications(result);
        }
    }

そして、スタックパネルに記入します:

private void GetApplications(string result)
    {
        var ApplicationsList = JsonConvert.DeserializeObject<List<Applications>>(result);
        foreach (Applications A in ApplicationsList)
        {
            foreach (ApplicationRelation SCA in A.ApplicationRelations)
            {
                if (SCA.ApplicationSubcategory != null)
                {
                    #region Fill Customer Research Stack
                    if (SCA.ApplicationSubcategory.subcategoryName == "Customer Research")
                    {
                        if (TestStack.Children.Count == 0)
                        {
                            ApplicationTile AT = FillDataForApplicationTile(SCA);                                
                            AT.Margin = new Thickness(5, 0, 5, 0);
                            TestStack.Children.Add(AT);
                        }
                    }
                    #endregion
                }
            }
        }
    }

コードは次の場所で失敗します。

if (TestStack.Children.Count == 0)

エラー: アプリケーションは、別のスレッド用にマーシャリングされたインターフェイスを呼び出しました。(HRESULT からの例外: 0x8001010E (RPC_E_WRONG_THREAD))

Request を void から string に書き換えるにはどうすればよいので、次のようなことができます。

GetApplications(await getAllData())

dcastroの編集2:

ここに画像の説明を入力

編集3:

おかげでうまくいきましたが、私はこのようなものを探していました:

//コードを変更しました:

GetApplications(getAllData2().Result);

private async Task<string> getAllData2()
    {
       string uri = "http://webservice.com/wfe";
       var client = new HttpClient();
       HttpResponseMessage response = await client.GetAsync(uri);
       var result = await response.Content.ReadAsStringAsync();
       return result.ToString();
    }

しかし、どういうわけか私の構造は GetApplication 関数に入りません...

4

2 に答える 2

1

を使用する代わりにAsyncCallback(UI 以外のスレッドで実行されていると確信していGetResponsetStreamCallbackます)、次のようにデータを取得してみてください。

private async void getAllData()
   string uri = "http://webservice.com/wfwe";
   var client = new HttpClient();

   HttpResponseMessage response = await client.GetAsync(uri);

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

   GetApplications(body);
}

これにより、Web サービスが非同期に呼び出され (行await Client.sendMessageAsync(msg);)、応答が受信されると元の UI スレッドに戻ります。このようにして、 などの UI 要素を更新できますTestStack

修正されたバグを編集

于 2013-09-17T08:47:19.060 に答える
0

これを試して。

private async Task<string> getAllData()
{
    string Result = "";
    var http = new HttpClient();
    var response = await http.GetAsync("http://webservice.com/wfwe"); // I am considering this URL gives me JSON
    if (response.StatusCode == System.Net.HttpStatusCode.OK)
    {
        Result = await response.Content.ReadAsStringAsync(); // You will get JSON here
    }
    else
    {
        Result = response.StatusCode.ToString(); // Error while accesing the web service.
    }

    return Result;
}

private async Task GetApplications(string result)
{
    var ApplicationsList = JsonConvert.DeserializeObject<List<Applications>>(result);
    foreach (Applications A in ApplicationsList)
    {
        foreach (ApplicationRelation SCA in A.ApplicationRelations)
        {
            if (SCA.ApplicationSubcategory != null)
            {
                #region Fill Customer Research Stack
                if (SCA.ApplicationSubcategory.subcategoryName == "Customer Research")
                {
                    if (TestStack.Children.Count == 0)
                    {
                        // This will update your UI using UI thread
                        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
                        {
                            ApplicationTile AT = FillDataForApplicationTile(SCA);
                            AT.Margin = new Thickness(5, 0, 5, 0);
                            TestStack.Children.Add(AT);
                        });
                    }
                }
                #endregion
            }
        }
    }
}
于 2013-09-17T08:49:40.423 に答える