C#学习教程:在C#中重复一个函数,直到它不再抛出异常为止但是,如果此请求超时,则会抛出异常。这很好。但是,我希望我的程序再次尝试进行此调用。如果超时,我希望它继续进行此调用,直到成功为止。我怎样才能做到这一点?例如:尝试{salesOrdersArray=MagServ.salesOrderList(sessID,filter);}抓住{??此处强制重新运行上述代码行直到成功。你只需要永远循环:while(true){try{salesOrdersArray=MagServ.salesOrderList(sessID,filter);休息;//退出循环。可以从该方法返回,这取决于//它的作用...}catch{//日志,我怀疑...}}请注意,您几乎可以肯定不会永远循环。您几乎肯定会进行最大次数的尝试,并且可能只会捕获特定的异常。永远捕获所有异常可能会令人震惊……想象一下,如果salesOrderList(非常规方法名称,顺便说一句)抛出ArgumentNullException,因为您有一个错误并且过滤器为空……您真的想永远占用100%的CPU吗?如果您无法更改超时,则以下内容应该有效。salesOrdersArray应初始化为null。while(salesOrdersArray==null){try{salesOrdersArray=MagServ.salesOrderList(sessID,filter);}catch{//记录失败}}您必须将try/catch块放在循环结构中。如果你不想消耗100%的处理器,那么在catch块里面放一个Thread.Sleep,这样每次异常发生的时候,它都会等待一段时间,让处理器腾出其他东西。//迭代100次...不是永远!for(inti=0;i也可以指定异常类型,这样只处理超时异常,其他类型的异常都通过。//迭代100次...不是永远!for(inti=0;i注意TimeOutException要换成异常的真名。。。不知道是不是真名。还要调整hibernate时间毫秒数和重复次数,我做的例子,100次重复1000次times产生最大等待1分40秒,加上操作时间本身。使用异常作为控制流不是一个好的理想,但这可以满足您的要求。boolCaught=true;while(Caught)try{salesOrdersArray=MagServ.salesOrderList(sessID,filter);Caught=false;}catch{Caught=true;}我将使用事务队列(MSMQ)来存储服务调用。循环将使消息出列并调用TransactionScope服务,如果调用失败,消息似乎还在队列中,可以通过给消息加上过期时间来指定整体超时。如果你真的想要一个可靠的解决方案,这个解决方案很好,因为我猜这个操作很关键。尝试布尔失败=假;做{尝试{salesOrdersArray=MagServ.salesOrderList(sessID,filter);}赶上{失败=真;}}而(失败);如果这永远行不通,您所追求的行为可能会导致无限循环……尝试这样的事情:varfailed=true;while(failed){try{salesOrdersArray=MagServ.销售订单列表(sessID,过滤器);失败=假;}catch{}}编辑:哇!大侠见仁见智!?虽然我不建议你无限次地这样做,但你可以用一句话创建一个单独的函数:voidGoConnect(){try{salesOrdersArray=MagServ.salesOrderList(sessID,filter);}抓住{GoConnect();}}while(salesOrdersArray==null){try{salesOrdersArray=MagServ.salesOrderList(sessID,filter);}catch(salesOrderExceptione){日志(e.message);这将永远运行并使用异常作为一个慢循环。有没有一种方法可以修改您的函数,使其返回null而不是抛出异常?如果您希望此调用定期失败,请不要使用try/catch块。我按照这个模式来解决这个问题:publicvoidSend(Stringdata,Int32attemptNumber){try{yourCodeHere(data);}catch(WebExceptionex){if(attemptNumber>0)Send(data,--attemptNumber);elsethrownewAttemptNumberExceededException("尝试次数超出!",ex);}catch(Exceptionex){//记录意图代码在这里!扔;永远尝试似乎不是一个好主意,因为你最终可能会遇到一个无限的过程。如果您认为需要多次尝试才能实现您的目标,请在此处设置一个较大的数字。我个人认为在eac尝试Thread.Sleep(1000)后等待几毫秒或几秒是明智的。在调用send(data)之前;—例如,如果您认为它适用于您的场景,您可以使用attemptNumber变量来增加或减少此等待时间。以上就是C#学习教程:在C#中重复一个函数,直到不再抛出异常为止。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注---boolrepeat=true;while(repeat){try{salesOrdersArray=MagServ.salesOrderList(sessID,filter);重复=假;}catch{}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
