0

私は2つの機能を持っています

public void sendGETRequest()
        {
            System.Uri targetUri = new System.Uri(urlAdress);
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(targetUri);
            request.Method = "GET";
            request.Headers["X_USERNAME"] = username;
            request.Headers["X_PASSWORD"] = password;
            request.BeginGetResponse(new AsyncCallback(ReadWebRequestCallback), request);
        }

        private void ReadWebRequestCallback(IAsyncResult callbackResult)
        {           
            HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.EndGetResponse(callbackResult);

            using (StreamReader httpwebStreamReader = new StreamReader(myResponse.GetResponseStream()))
            {
                result = httpwebStreamReader.ReadToEnd();                
            }
            myResponse.Close();
            if (Completed != null)
                Completed();
        }
    }

電話すると

 GET user;   
    public String GETUserList()
    {
      user  = new GET();
      user.urlAdress = url + "user";
       user.username = username;
       user.password = password;

       user.sendGETRequest();

       user.Completed += OutUser;

       if (Completed != null)
           Completed();


       return user.result;
    }


void OutUser()
            {
               Debug.WriteLine(user.result);
            }

このように1つのアクションを呼び出すと、ユーザーのリストを取得するには

String json = GETUserList();
            Debug.WriteLine("Hllllllllllll" + json + "HHHHHHHHHHHHHH" + p.resultWords);

戻る

HllllllllllllHHHHHHHHHHHHHH
[{"id":"3","username":"a","password":"a"},{"id":"4","username":"bbbb\n","password":"aaa"},{,{"id":"13","username":"abcdef","password":"abcdef"},{"id{"id":"10","word":"AAAAddddA","definition":"aaa","cardset_id":"2"},{"id":"11","word":"AAAAddddA","definition":"aaa","cardset_id":"2"},{"id":"12","word":"asdas","definition":"asdasd","cardset_id":"1"},{"id":"13","word":"asdas","definition":"asdasd","cardset_id":"1"},{"id":"14","word":"AAAAddddA","definition":"aaa","cardset_id":"2"},{"id":"15","word":"AAAAddddA","definition":"aaa","cardset_id":"2"},{"id":"16","word":"asdas","definition":"asdasd","

関数 ReadWebRequestCallback(IAsyncResult callbackResult)はバックグラウンドで実行され、ユーザーのリストを取得するために呼び出すと、 その後実行されると思います(デバッグしました。アクションが完了する前に実行するにはどうすればよいですか?事前に感謝します!

4

1 に答える 1

1

仕組みは次のとおりです。

BeginGetResponse -> makes an asynchronous web request
asynchronous request completed -> makes a callback: ReadWebRequestCallback
ReadWebRequestCallback -> read the response

ReadWebRequestCallbackしたがって、...のreturnステートメントに到達する前に待機したいようですGETUserList()。その後、非同期要求を発行しないでください。他のことを行うと、非同期要求を発行する目的が事実上無効になります。

手動リセットイベントを使用できます。

public class GETUser
{
    public ManualResetEvent mrse = new ManualResetEvent(false);
    // other fields 
}

public String GETUserList()
{
    user  = new GET();
    user.urlAdress = url + "user";
    user.username = username;
    user.password = password;

    user.sendGETRequest();

    user.Completed += OutUser;

    if (Completed != null)
       Completed();

    user.mrse.WaitOne(); // <--- block until the event is raised
    return user.result;
}

そしてコールバックで:

private void ReadWebRequestCallback(IAsyncResult callbackResult)
{           
    HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
    HttpWebResponse myResponse = (HttpWebResponse)myRequest.EndGetResponse(callbackResult);

    using (StreamReader httpwebStreamReader = new StreamReader(myResponse.GetResponseStream()))
    {
        result = httpwebStreamReader.ReadToEnd();                
    }
    myResponse.Close();
    if (Completed != null)
        Completed();

    mrse.Signal();// <-- signal that you have finished reading
}

繰り返しますが、これは非同期Web要求を行う目的を無効にします。

于 2012-05-05T23:31:37.517 に答える