新手求教 循环POST信息思路

问题描述

我想做个多组参数的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

时间: 2024-08-01 14:27:55

新手求教 循环POST信息思路的相关文章

新手求教,关于java压缩文件的问题

问题描述 新手求教,关于java压缩文件的问题 import java.io.*;import java.util.zip.*;public class Myzip { private void zip(ZipOutputStream outFile fString base) throws Exception{ if(f.isDirectory()){ File f1[]=f.listFiles(); out.putNextEntry(new ZipEntry(base+""/&qu

新手求教 php查询 遍历数据库 多条符合条件数据输出的记录只有一条

问题描述 新手求教 php查询 遍历数据库 多条符合条件数据输出的记录只有一条 ($result = 0;//搜索结果默认值(不搜索) 1=正确搜索到结果2=搜索到结果但非第一次3=没搜索到结果4=系统提示) if($msg0 == 1){ ///号信息 $sql=""select * from tgs_code where bianhao='$bianhao'""; //sql语句在数据库查询可返回多条记录 ///echo $sql; $res=mysql_que

新手求教,为什么我的jsp连接mysql,跳出的网页上什么都没有,

问题描述 新手求教,为什么我的jsp连接mysql,跳出的网页上什么都没有, <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import = "java.sql.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transiti

新手求教,关于传递字符串数组的问题

问题描述 新手求教,关于传递字符串数组的问题 以下是我写的c primer plus 第11章习题10的程序,问题是我输入字符串后,用1以外的方式排序,就无法恢复原序列了.也就是每次调用函数都改变了原本数组的顺序,我实在找不到问题出在哪.特请高手指教,如果我的代码还有其他的什么毛病也请指出来.O(∩_∩)O谢谢 #include<stdio.h> #include<string.h> #include<ctype.h> #define LIM 10 #define MA

javascript-js简单的for语句,急,新手求教!

问题描述 js简单的for语句,急,新手求教! 什么情况,为什么i会未定义? 解决方案 我想楼主在监测js代码的时候一定是把断点打在for语句上了:在第一次走到循环语句的时候,改行并未被执行,也即是var i=0;这句话并没有执行到编译器(假想)中,所以,此时并没有产生对它的声明,从而看到的是undefined,楼主可以尝试先走一遍循环体,也就是第二次进入的时候,再次检测就能够发现i是已经被声明了的,且值为1. 解决方案二: for语句的简单应用③[JS--基础--语句]--for in 循环遍

新手求教。java next()

问题描述 新手求教.java next() 各位好,有个问题请教一下.代码: public class hello{ public static void main(String[] args) { Scanner input1=new Scanner(System.in); label1: while(true){ System.out.println("请选择查询方法:a.图书信息 b.图书序号"); String choose=input1.next(); if(choose =

关于java中的输入输出流的问题,新手求教,谢谢

问题描述 关于java中的输入输出流的问题,新手求教,谢谢 import java.io.*; public class Filetest3 { public static void main(String[] args) { // TODO Auto-generated method stub File file=new File("word.txt"); try{ FileOutputStream out=new FileOutputStream(file); byte mybyt

新手求教fragment问题

问题描述 新手求教fragment问题 1.为什么不直接new一个FargmentManager,而要用getFragmentManager()? 2.为什么要用FragmentManager启动FragmentTransaction,而不是直接new一个? 直接new不是更方便吗?这样的设计思路是什么?本人新手,现在还看不懂API文档和源码,希望大神能聊几句. 谢谢 解决方案 [关于网站收录问题,新手求教][教学] Discuz!风格安装方法及问题[新手必读]windows编程新手常见问题 解

c s架构-刚接触c/s架构,新手求教~TX

问题描述 刚接触c/s架构,新手求教~TX int bytesSent, left, idx=0; int bytesRecv = SOCKET_ERROR; char sendbuf[DEFAULT_BUFFER] = ""; char recvbuf[DEFAULT_BUFFER] = ""; while(1) { printf("[The message you want to send to the server]:"); fgets(s