异步调用C#.Net初学者提问

时间:2010-09-15 06:44:36

标签: silverlight asynchronous c#-4.0

所以我在这里,从一些网络教程获得一些帮助并执行以下异步调用。我想从以下异步调用返回UserInfo类型的对象。但是我不确定在request.BeginResponse()之后程序是如何流动的。是否类似于UserInfo类型的附加ref参数可以传递给回调方法?

        UserInfo GetUserInfoAsync()
        {
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.Credentials = new NetworkCredential("myID", "myPWD");
        request.Method = "GET";
        request.Accept = "application/json";

        object data = new object();
        RequestState state = new RequestState(request, data, url);
        IAsyncResult asr = request.BeginGetResponse(new AsyncCallback(myCallback), state);
        return null; //Need guidence here;
        }

        private static void myCallback(IAsyncResult result)
        {

        RequestState state = (RequestState)result.AsyncState;
        WebRequest request = (WebRequest)state.Request;
        HttpWebResponse response =(HttpWebResponse)request.EndGetResponse(result);

        Stream s = response.GetResponseStream();
        StreamReader readStream = new StreamReader(s);
        string dataString = readStream.ReadToEnd();

        response.Close();
        s.Close();
        readStream.Close();
        UserInfo ui = ParseJSON(dataString );
        }

3 个答案:

答案 0 :(得分:1)

您的GetUserInfoAsync方法将在请求完成之前返回。这就是异步的意思。您需要使用刚刚收到的UserInfo对您的回调采取适当的措施 - 例如回调到UI线程(使用Dispatcher)来更新UI。

可以让你的GetUserInfo来电等待,直到得到结果 - 但你基本上不应该这样做。异步调用的重点是避免阻塞。

答案 1 :(得分:0)

您需要处理回调中的数据。如果需要从初始方法调用返回用户信息,则需要同步操作。在操作完成之前,无法获得该信息。

答案 2 :(得分:0)

return null; //Need guidence here;

此时您无法返回任何有意义的内容。使用来自回调的事件来通知结果已准备就绪。