0

UploadStringCompletedEventHandler イベントが正常に実行されたことを確認する方法は? 次のコードでは、関数 UploadMyPOST を呼び出しており、lastreads パラメータにデータが含まれていることがわかります。ここで、response という名前の変数を MyClassXYZ 変数に保存していることがわかります。最後に、メソッド UploadMyPost() によって呼び出されたイベントがサーバー応答を応答変数に入力していることがわかります。ここでの問題は、UploadMyPost(lastreads) が正常に実行されますが、呼び出されたイベントが実行されないことです。カーソルでさえ、サーバーの応答を応答変数に入力できないイベントに移動しません。そのイベントが正常に実行され、サーバーの応答を保存できるまで待機できるアプローチを知っている人はいますか?

private async void MyMethod(MyClassXYZ lastreads)
{
     await UploadMyPOST(lastreads);
     MyClassXYZ serverResponse = response;
     if (serverResponse.Book == null)
     {
           //Do Something.
     }
}

private void UploadMyPOST(MyClassXYZ lastreads)
{
    apiData = new MyClassXYZApi()
    {
       AccessToken = thisApp.currentUser.AccessToken,
       Book = lastreads.Book,
       Page = lastreads.Page,
       Device = lastreads.Device
    };
    //jsondata is my global variable of MyClassXYZ class.
    jsondata = Newtonsoft.Json.JsonConvert.SerializeObject(apiData);
    MyClassXYZ responsedData = new MyClassXYZ();
    Uri lastread_url = new Uri(string.Format("{0}lastread", url_rootPath));
    WebClient wc = new WebClient();
    wc.Headers["Content-Type"] = "application/json;charset=utf-8";
    wc.UploadStringCompleted += new UploadStringCompletedEventHandler(MyUploadStringCompleted);
    wc.UploadStringAsync(lastread_url, "POST", jsondata);
}

private void MyUploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
    try
    {
        if (e.Error == null)
        {
            string resutls = e.Result;
            DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(MyClassXYZ));
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(resutls));
            response = (MyClassXYZ)json.ReadObject(ms);
        }
        else
        {
            string sx = e.Error.ToString();
        }
   }
   catch(Exception exe)
   {
   }
 }

//Stephen の提案の後、私は HttpClient を使用したので、HttpClient の助けを借りて新しいコードを書きました。コードは正常にビルドされていますが、実行時にカーソルがこのメソッドから親メソッドに移動し、その呼び出し元になります。

   private async Task<string> UploadMyPOST(MyClassXYZ lastreads)
   {
        string value = "";
        try
        {
            apiData = new LastReadAPI()
            {
                AccessToken = thisApp.currentUser.AccessToken,
                Book = lastreads.Book,
                Page = lastreads.Page,
                Device = lastreads.Device
            };
            jsondata = Newtonsoft.Json.JsonConvert.SerializeObject(apiData);
            LastRead responsedData = new LastRead();
            Uri lastread_url = new Uri(string.Format("{0}lastread", url_rootPath));
            HttpClient hc = new HttpClient();

            //After following line cursor go back to main Method.
            var res = await hc.PostAsync(lastread_url, new StringContent(jsondata));
            res.EnsureSuccessStatusCode();
            Stream content = await res.Content.ReadAsStreamAsync();
            return await Task.Run(() => Newtonsoft.Json.JsonConvert.SerializeObject(content));
            value = "kd";
        }
        catch
        { }
        return value;
   }
4

2 に答える 2

2

/HttpClientペアを使用するか、Task ベースのメソッドにラップするUploadStringAsyncUploadStringCompletedことをお勧めします。その後、awaitで好きなように使用できますMyMethod

于 2014-02-10T12:50:36.707 に答える