C# AsyncCallback函数如何等待它完成并在调用时获取结果
我有两个功能C# AsyncCallback函数如何等待它完成并在调用时获取结果,c#,multithreading,windows-phone-7,httpwebrequest,C#,Multithreading,Windows Phone 7,Httpwebrequest,我有两个功能 public void sendGETRequest() { System.Uri targetUri = new System.Uri(urlAdress); HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(targetUri); request.Method = "GET"; request
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)是在后台运行的,当我调用以获取用户列表时,它会在之后执行(我已经调试)。
如何使其在操作完成之前运行?
感谢您的帮助!以下是它的工作原理:
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
}
在
公共字符串GETUserList()
{
user=newget();
user.urlAdress=url+“用户”;
user.username=用户名;
user.password=密码;
user.sendGETRequest();
user.Completed+=OutUser;
如果(已完成!=null)
已完成();
user.mrse.WaitOne();//对不起,我的英语不好。我已编辑我想调用sendGETRequest以获取用户列表我想将sendGETRequest的结果分配给variable.mrse.Sigal()windowphone 7.1是否可以使用它?@chanhle,应该是……我假设windowphone 7.1使用的是.NET framework,并且ManualResetEvent
已经存在一段时间了:
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
}