在定时器不工作时使用multi-httpwebrequest调用webservice
本文关键字:multi-httpwebrequest 调用 webservice 定时器 工作 | 更新日期: 2023-09-27 18:01:07
我在使用(Windows Phone应用程序(调用同一URL时遇到问题
HttpWebRequest.Create(new Uri("http://x.x.x.x/webservice.svc/Getnewtick")) as HttpWebRequest
我在功能内部使用这个请求,这个功能在计时器上工作,我用fiddler检查了流量,我发现第一个请求工作,但第二个不发送新请求到服务器,你能告诉我吗(注意,我在功能中放了消息框,它在时间上显示得很好,这意味着计时器工作得很好(
这是我的代码,根据您的要求:-
private void FireRequest3(Object sender, EventArgs args)
{
MessageBox.Show("hello");
var request = HttpWebRequest.Create(new Uri("http://x.x.x.x/webservice.svc/Getnewtick")) as HttpWebRequest
request.Method = "GET";
request.CookieContainer = cookieJar;
request.BeginGetResponse(ar =>
{
HttpWebRequest req2 = (HttpWebRequest)ar.AsyncState;
using (var response = (HttpWebResponse)req2.EndGetResponse(ar))
{
using (Stream stream = response.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
var outerRoot2 = JsonConvert.DeserializeObject<OuterRootObject2>(reader.ReadToEnd());
var root = JsonConvert.DeserializeObject<RootObject2>(outerRoot2.d);
DispatchInvoke(() =>
{
foreach (var Symbols1 in root.Symbols)
{
foreach (var nnn in DataReceivedCollection)
{
var symbolIDintold = Convert.ToInt16(nnn.symid);
var symbolIDintnew = Convert.ToInt16(Symbols1.I);
var BidStr = Convert.ToString(Symbols1.B);
var AskStr = Convert.ToString(Symbols1.B);
if (symbolIDintold == symbolIDintnew)
{
nnn.textSecond = BidStr;
nnn.textThird = AskStr;
}
}
}
});
}
}
}
}, request);
}
带有计时器的启动按钮为:-
private void Button_Click_2(object sender, EventArgs e)
{
DispatcherTimer newTimer = new DispatcherTimer();
newTimer.Interval = TimeSpan.FromSeconds(3);
newTimer.Tick += FireRequest3;
newTimer.Start();
}
您可以从简化样本开始,例如用var foo = reader.ReadToEnd();
替换整个内部零件-如果这有帮助,那么您就知道下一步该在哪里查找错误。
如果这没有帮助,那么试着延长间隔。在我的一些应用程序中,我发现在任何给定时间只有X个HttpWebRequest实例可以处于活动状态,其中X介于1和8之间,可能与请求地址有关,也可能与请求无关。我最终得到了一个助手类,它将所有请求(以及它们的响应(排入队列,这样在任何给定的时间都只存在一个HttpWebRequest。
我已经这样解决了它,我把标题改成这样:-
HttpWebRequest.Create(new Uri("http://x.x.x.x/webservice.svc/Getnewtick")) as HttpWebRequest
if (request.Headers == null)
{
request.Headers = new WebHeaderCollection();
}
request.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString();