问题描述
我想做个多组参数的POST到一个地址,然后取得返回值判断,成功后则该组参数不再提交。那么存在一个问题是返回值取得的比较慢,我想等得到返回值后才第二次提交相同的一组参数,这个怎么做呢。新手,赐教,谢谢哈
解决方案
解决方案二:
慢也是你自己设计的。要什么“怎么做”?就第二次开始提交呗。
解决方案三:
你需要使用调度器模式,这是很经典的模式。主程序控制任务的数量,并且分派给线程,线程执行失败再将同样的任务发给调度器。调度器本身只负责维护不同的任务。
解决方案四:
引用2楼caozhy的回复:
你需要使用调度器模式,这是很经典的模式。主程序控制任务的数量,并且分派给线程,线程执行失败再将同样的任务发给调度器。调度器本身只负责维护不同的任务。
不是失败……是返回信息后再次提交
解决方案五:
引用1楼sp1234的回复:
慢也是你自己设计的。要什么“怎么做”?就第二次开始提交呗。
额,是服务器返回的慢,我如果不等第一次提交的返回值,那么多次POST后会内存容量很大,导致奔溃
解决方案六:
你的意思是有一系列数据,一个个提交,成功提交执行下一个,否则继续提交当前项如果这样的话,你可以将这个工作交给其他线程去处理,这样主线程也不会卡
解决方案七:
引用5楼wpfLove的回复:
你的意思是有一系列数据,一个个提交,成功提交执行下一个,否则继续提交当前项如果这样的话,你可以将这个工作交给其他线程去处理,这样主线程也不会卡
不是的,是提交一系列数据,如1,2,3,4,5如果POST的1在运行中,则暂不提交1,待1有了返回结果后,继续POST1如果POST的2得到了返回结果,则继续POST2这几组数据都是同时一直在提交的,哪个提交得到了返回值就继续提交哪个
解决方案八:
为每个数据单开线程,循环执行自己的提交,可以使用ThreadPool线程池
解决方案九:
引用7楼wpfLove的回复:
为每个数据单开线程,循环执行自己的提交,可以使用ThreadPool线程池
但是这样会不等第一次提交返回结果就又一次提交了啊
解决方案十:
引用8楼jeplv的回复:
Quote: 引用7楼wpfLove的回复:
为每个数据单开线程,循环执行自己的提交,可以使用ThreadPool线程池但是这样会不等第一次提交返回结果就又一次提交了啊
你不异步进行,有了返回结果,才会继续执行,否则等待中
解决方案十一:
谢谢哈,异步确实能解决我这个问题,不过我遇到知识性问题了,菜鸟别见怪啊。usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Web;usingSystem.IO;usingSystem.Net;usingSystem.Threading;namespaceWindowsFormsApplication1{publicpartialclasstest_post:Form{inti=0;privatedelegateintAsyncFuncDelegate(intm);publictest_post(){InitializeComponent();TextBox.CheckForIllegalCrossThreadCalls=false;}privatevoidForm1_Load(objectsender,EventArgse){}privatevoidbutton1_Click(objectsender,EventArgse){label1.Text="agent";agent();}voidagent(){AsyncFuncDelegateafd=AsyncFunc;afd.BeginInvoke(i,AsyncFuncComplete,afd);}privatevoidAsyncFuncComplete(IAsyncResultar){if(ar==null){return;}//完成时执行label1.Text="完成";}privateintAsyncFunc(intm){post_str(m);returnm;}voidpost_str(intstr){try{label1.Text="正常";stringpostData="cmd="+str;byte[]byteArray=Encoding.Default.GetBytes(postData);HttpWebRequestmyRequest=(HttpWebRequest)WebRequest.Create("http://localhost/index.asp");myRequest.Method="POST";myRequest.ContentType="application/x-www-form-urlencoded";myRequest.ContentLength=byteArray.Length;StreamnewStream=myRequest.GetRequestStream();//Sendthedata.newStream.Write(byteArray,0,byteArray.Length);newStream.Close();}catch{label1.Text="错误";}}}}
点击按钮后,运行一次,然后再点击按钮就不运行了,这是为啥呢
解决方案十二:
引用9楼wpfLove的回复:
Quote: 引用8楼jeplv的回复:
Quote: 引用7楼wpfLove的回复:
为每个数据单开线程,循环执行自己的提交,可以使用ThreadPool线程池但是这样会不等第一次提交返回结果就又一次提交了啊
你不异步进行,有了返回结果,才会继续执行,否则等待中
解决方案十三:
我的意思是不进行异步控制,就多线程,每个提交都是单独的线程,这样让他们提交,等待,判断结果,继续提交......
解决方案十四:
引用10楼jeplv的回复:
谢谢哈,异步确实能解决我这个问题,不过我遇到知识性问题了,菜鸟别见怪啊。usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Web;usingSystem.IO;usingSystem.Net;usingSystem.Threading;namespaceWindowsFormsApplication1{publicpartialclasstest_post:Form{inti=0;privatedelegateintAsyncFuncDelegate(intm);publictest_post(){InitializeComponent();TextBox.CheckForIllegalCrossThreadCalls=false;}privatevoidForm1_Load(objectsender,EventArgse){}privatevoidbutton1_Click(objectsender,EventArgse){label1.Text="agent";agent();}voidagent(){AsyncFuncDelegateafd=AsyncFunc;afd.BeginInvoke(i,AsyncFuncComplete,afd);}privatevoidAsyncFuncComplete(IAsyncResultar){if(ar==null){return;}//完成时执行label1.Text="完成";}privateintAsyncFunc(intm){post_str(m);returnm;}voidpost_str(intstr){try{label1.Text="正常";stringpostData="cmd="+str;byte[]byteArray=Encoding.Default.GetBytes(postData);HttpWebRequestmyRequest=(HttpWebRequest)WebRequest.Create("http://localhost/index.asp");myRequest.Method="POST";myRequest.ContentType="application/x-www-form-urlencoded";myRequest.ContentLength=byteArray.Length;StreamnewStream=myRequest.GetRequestStream();//Sendthedata.newStream.Write(byteArray,0,byteArray.Length);newStream.Close();}catch{label1.Text="错误";}}}}点击按钮后,运行一次,然后再点击按钮就不运行了,这是为啥呢
加入断点,判断是否执行Click事件,以及其他的内部执行情况,但是你这么多的委托,同时都在操作同一个label1,效果不太好。。
解决方案十五:
引用13楼wpfLove的回复:
Quote: 引用10楼jeplv的回复:
谢谢哈,异步确实能解决我这个问题,不过我遇到知识性问题了,菜鸟别见怪啊。usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Web;usingSystem.IO;usingSystem.Net;usingSystem.Threading;namespaceWindowsFormsApplication1{publicpartialclasstest_post:Form{inti=0;privatedelegateintAsyncFuncDelegate(intm);publictest_post(){InitializeComponent();TextBox.CheckForIllegalCrossThreadCalls=false;}privatevoidForm1_Load(objectsender,EventArgse){}privatevoidbutton1_Click(objectsender,EventArgse){label1.Text="agent";agent();}voidagent(){AsyncFuncDelegateafd=AsyncFunc;afd.BeginInvoke(i,AsyncFuncComplete,afd);}privatevoidAsyncFuncComplete(IAsyncResultar){if(ar==null){return;}//完成时执行label1.Text="完成";}privateintAsyncFunc(intm){post_str(m);returnm;}voidpost_str(intstr){try{label1.Text="正常";stringpostData="cmd="+str;byte[]byteArray=Encoding.Default.GetBytes(postData);HttpWebRequestmyRequest=(HttpWebRequest)WebRequest.Create("http://localhost/index.asp");myRequest.Method="POST";myRequest.ContentType="application/x-www-form-urlencoded";myRequest.ContentLength=byteArray.Length;StreamnewStream=myRequest.GetRequestStream();//Sendthedata.newStream.Write(byteArray,0,byteArray.Length);newStream.Close();}catch{label1.Text="错误";}}}}点击按钮后,运行一次,然后再点击按钮就不运行了,这是为啥呢
加入断点,判断是否执行Click事件,以及其他的内部执行情况,但是你这么多的委托,同时都在操作同一个label1,效果不太好。。
我这个就只有运行了一次啊,点击按钮不是自动执行CLICK事件吗
解决方案:
你说的再次点击,不执行,所以要你加入断点看看是什么情况,还有你的i是干嘛的,除了定义了初始值0外,没有做其他处理吧。另外你的post_str只是写了请求的数据,没有得到返回数据,调用GetResponse方法,得到返回数据,判断是否继续执行。代码还是有点问题,试试多线程吧(不需要异步)
解决方案:
引用15楼wpfLove的回复:
你说的再次点击,不执行,所以要你加入断点看看是什么情况,还有你的i是干嘛的,除了定义了初始值0外,没有做其他处理吧。另外你的post_str只是写了请求的数据,没有得到返回数据,调用GetResponse方法,得到返回数据,判断是否继续执行。代码还是有点问题,试试多线程吧(不需要异步)
额,线程快是快,但是时间久了就会积攒太多的返回值内存占用太大了,所以我想用异步,让post方法运行完毕,释放内存后再进行下一次POST
解决方案:
你的返回值是有多大啊?不行的话,就使用GC,强制回收,反正你的主线程是空闲的,不参与post