【问题标题】:Asyncallback function how to wait it for completed and get result when call异步回调函数如何等待它完成并在调用时获取结果
【发布时间】:2012-05-05 23:21:19
【问题描述】:

我有两个功能

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) 是在后台运行的,当 I Call to get list of User 之后它会执行(我已经调试过。 如何让它在动作完成之前运行? 感谢提前!

【问题讨论】:

    标签: c# multithreading windows-phone-7 httpwebrequest


    【解决方案1】:

    这是它的工作原理:

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

    因此,您似乎希望在到达GETUserList() 中的return 语句之前等待ReadWebRequestCallback...然后不要发出异步请求。做任何其他事情都会有效地破坏发出异步请求的目的。

    您可以使用手动重置事件:

    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 请求的目的。

    【讨论】:

    • 对不起,我的英语不好。我已经编辑了我想调用 sendGETRequest 来获取用户列表我想将 sendGETRequest 的结果分配给变量。
    • mrse.Sigal() 是否适用于windowphone7.1?
    • @chanhle,应该是...我假设windowphone 7.1 正在使用.NET 框架并且ManualResetEvent 已经存在了一段时间:msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多