C# 如何同步等待HttpWebRequest回调方法获得响应
我希望RemoteInsert()方法等待我的回调GetResponseCallback。 我无法做到这一点,因为我尝试了很多事情。C# 如何同步等待HttpWebRequest回调方法获得响应,c#,wcf,windows-phone-8,synchronization,httpwebrequest,C#,Wcf,Windows Phone 8,Synchronization,Httpwebrequest,我希望RemoteInsert()方法等待我的回调GetResponseCallback。 我无法做到这一点,因为我尝试了很多事情。 有人能在这里帮助我吗。 我不希望主线程在响应到来之前执行其他操作。 请建议。在回答之后,我必须将其用于下一次执行 public void RemoteInsert() { String dataSet = "dataset=" + json.ToString(); accessKey = mobRemoteDB.access
有人能在这里帮助我吗。 我不希望主线程在响应到来之前执行其他操作。 请建议。在回答之后,我必须将其用于下一次执行
public void RemoteInsert()
{
String dataSet = "dataset=" + json.ToString();
accessKey = mobRemoteDB.accessKey;
String paramaters = "?llcommand=sndmsg&" + "ak=" + accessKey + "&command=remoteinsert&" + dataSet;
String url = mobRemoteDB.baseUrlForRemoteInsert + paramaters;
HttpWebRequest webRequest = (HttpWebRequest)System.Net.WebRequest.Create(url);
webRequest.Method = "POST";
webRequest.ContentType = "application/json";
if (NetworkInterface.GetIsNetworkAvailable() & IsDataValid)
{
webRequest.BeginGetRequestStream(newAsyncCallback(GetRequestStreamCallback),webR equest);
}
}
void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest);
}
void GetResponseCallback(IAsyncResult asynchronousResult)
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamReader = new StreamReader(streamResponse);
JObject json_response = JObject.Parse(streamReader.ReadToEnd());
String key = (String)json_response["ret"];
JObject dic = (JObject)json_response["retdic"];
}
catch(WebException e)
{
}
}
我想实现它,就像第一个任务A完成一样,然后是任务(C),因为它是关于任务(A)成功的。那么任务(B)如果我理解您的问题,您希望在调用线程上执行webrequest,并等待它完成后再继续 您可以使用async/await简化
RemoteInsert()
方法,并使用GetResponseAsync()
方法在一次调用中获取响应对象。大概是这样的:
Here My code is going like
1. Task(A).running----await
2. ------------------------------->Task(B)
3 ---------Response From Task(A)------->Task(C)
失去另外两种方法,因为它们不再需要了
调用此方法时,可以对其进行等待():
然而,WP试图强制好的异步模式来避免这样做。在这种情况下,您需要什么来阻止UI线程
在调用RemoteInsert()的方法中。。。让我们假设这是某种按钮点击事件。。。你不能这样做吗
RemoteInsert().Wait();
换句话说,与其阻塞UI线程,不如在RemoteInsert()方法完成后执行其他方法。如果我理解您的问题,您希望在调用线程上执行webrequest,并等待它完成后再继续 您可以使用async/await简化
RemoteInsert()
方法,并使用GetResponseAsync()
方法在一次调用中获取响应对象。大概是这样的:
Here My code is going like
1. Task(A).running----await
2. ------------------------------->Task(B)
3 ---------Response From Task(A)------->Task(C)
失去另外两种方法,因为它们不再需要了
调用此方法时,可以对其进行等待():
然而,WP试图强制好的异步模式来避免这样做。在这种情况下,您需要什么来阻止UI线程
在调用RemoteInsert()的方法中。。。让我们假设这是某种按钮点击事件。。。你不能这样做吗
RemoteInsert().Wait();
换句话说,与其阻塞UI线程,不如在RemoteInsert()方法完成后执行其他方法。如果我理解您的问题,您希望在调用线程上执行webrequest,并等待它完成后再继续 您可以使用async/await简化
RemoteInsert()
方法,并使用GetResponseAsync()
方法在一次调用中获取响应对象。大概是这样的:
Here My code is going like
1. Task(A).running----await
2. ------------------------------->Task(B)
3 ---------Response From Task(A)------->Task(C)
失去另外两种方法,因为它们不再需要了
调用此方法时,可以对其进行等待():
然而,WP试图强制好的异步模式来避免这样做。在这种情况下,您需要什么来阻止UI线程
在调用RemoteInsert()的方法中。。。让我们假设这是某种按钮点击事件。。。你不能这样做吗
RemoteInsert().Wait();
换句话说,与其阻塞UI线程,不如在RemoteInsert()方法完成后执行其他方法。如果我理解您的问题,您希望在调用线程上执行webrequest,并等待它完成后再继续 您可以使用async/await简化
RemoteInsert()
方法,并使用GetResponseAsync()
方法在一次调用中获取响应对象。大概是这样的:
Here My code is going like
1. Task(A).running----await
2. ------------------------------->Task(B)
3 ---------Response From Task(A)------->Task(C)
失去另外两种方法,因为它们不再需要了
调用此方法时,可以对其进行等待():
然而,WP试图强制好的异步模式来避免这样做。在这种情况下,您需要什么来阻止UI线程
在调用RemoteInsert()的方法中。。。让我们假设这是某种按钮点击事件。。。你不能这样做吗
RemoteInsert().Wait();
换句话说,与其阻塞UI线程,不如在RemoteInsert()方法完成后执行这些其他方法。您是否厌倦了使用webRequest.GetRequestStream()而不是.BeginGetRequestStream()你提到你“尝试了很多东西”。了解您的尝试会很有帮助。我尝试了EventWaitHandle InsertionOne=new EventWaitHandle(false,EventResetMode.ManualReset);然后插入一个.WaitOne();等待。但即使在设置SignalInsertionOne1.Set()之后,应用程序仍处于死锁状态;接收到响应但没有webRequest.GetRequestStream()方法是否厌倦了使用webRequest.GetRequestStream()而不是.BeginGetRequestStream()你提到你“尝试了很多东西”。了解您的尝试会很有帮助。我尝试了EventWaitHandle InsertionOne=new EventWaitHandle(false,EventResetMode.ManualReset);然后插入一个.WaitOne();等待。但即使在设置SignalInsertionOne1.Set()之后,应用程序仍处于死锁状态;接收到响应但没有webRequest.GetRequestStream()方法是否厌倦了使用webRequest.GetRequestStream()而不是.BeginGetRequestStream()你提到你“尝试了很多东西”。了解您的尝试会很有帮助。我尝试了EventWaitHandle InsertionOne=new EventWaitHandle(false,EventResetMode.ManualReset);然后插入一个.WaitOne();等待。但即使在设置SignalInsertionOne1.Set()之后,应用程序仍处于死锁状态;接收到响应但没有webRequest.GetRequestStream()方法是否厌倦了使用webRequest.GetRequestStream()而不是.BeginGetRequestStream()你提到你“尝试了很多东西”。了解您的尝试会很有帮助。我尝试了EventWaitHandle InsertionOne=new EventWaitHandle(false,EventResetMode.ManualReset);然后插入一个.WaitOne();等待。但即使在设置SignalInsertionOne1.Set()之后,应用程序仍处于死锁状态;其中接收到响应,但没有webRequest.GetRequestStream()方法