gpt4 book ai didi

c# - 为什么不调用 BeginGetResponse 回调?

转载 作者:行者123 更新时间:2023-12-03 13:21:29 24 4
gpt4 key购买 nike

这是我的代码:

namespace RequestApi
{
public partial class MainPage : PhoneApplicationPage
{
private BackgroundWorker bw;
private string ans;
private JObject ansJson;
private static ManualResetEvent allDone = new ManualResetEvent(false);
// Constructor
public MainPage()
{
InitializeComponent();

}

private void button1_Click(object sender, RoutedEventArgs e)
{
string url = "http://192.168.0.43:8182/Account/SignIn";
CreateRequest(url);

userId.Text = ansJson.Value<int>("user_id").ToString();

}


private void CreateRequest(string url)
{
Debug.WriteLine("CreateRequest");
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.ContentType = "application/json";
req.Method = "POST";
req.BeginGetRequestStream(new AsyncCallback(RequestCallback), req);
allDone.WaitOne();
}

private void RequestCallback(IAsyncResult aresult)
{
Debug.WriteLine("RequestCallback");
HttpWebRequest req = (HttpWebRequest)aresult.AsyncState;
Stream postStream = req.EndGetRequestStream(aresult);

string obj = "{ 'username': 'test_2@aragast.com', 'password': 'a123456' }";
JObject json = JObject.Parse(obj);
string s = JsonConvert.SerializeObject(json);
byte[] postdata = System.Text.Encoding.Unicode.GetBytes(s);

postStream.Write(postdata, 0, postdata.Length);
postStream.Close();

req.BeginGetResponse(new AsyncCallback(ResponseCallback), req);


}

private void ResponseCallback(IAsyncResult aresult)
{
Debug.WriteLine("ResponseCallback");
HttpWebRequest req = (HttpWebRequest)aresult.AsyncState;
HttpWebResponse resp = (HttpWebResponse)req.EndGetResponse(aresult);
StreamReader reader = new StreamReader(resp.GetResponseStream());
string response = reader.ReadToEnd();
Debug.WriteLine(response);
JObject responseJson = JObject.Parse(response);
ansJson = responseJson;
Debug.WriteLine("ansJson from responseCallback {0}", ansJson);
reader.Close();
resp.Close();
allDone.Set();

}
}
}

当我调试应用程序时,它输入了 CreateRequest,然后输入了 RequestCallback,但随后它停止并且从不输入 ResponseCallback,而是尝试使用 userId.Text 分配 asnJson 值为 null,因为它没有输入 ResponseCallback。当我做错时,为什么它永远不会进入ResponseCallback?

最佳答案

您的 ManualResetEvent使用 true 创建作为参数,所以它已经发出信号开始了。这意味着 allDone.Wait()通话将立即继续...所以CreateRequest将完成,您将立即尝试使用 asnJson变量,正如你所说的是 null .我怀疑这会杀死应用程序 - 所以你永远没有机会得到回应。

现在,解决此问题的方法是不要更改 ManualResetEvent构造函数——无论如何,你不应该在 UI 线程中那样等待!你会阻止它,并且你已经删除了 Windows Phone 7 的全部要点,使一切从一开始都是异步的。

相反,您的回调应该在完成后使用调度程序回调到 UI 线程。请注意,如果请求出现任何问题,您还应该进行强大的错误处理。

关于c# - 为什么不调用 BeginGetResponse 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7677665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com