.net构造while循环和超时我一般都是用while循环不断尝试,直到运行成功或者超时结束:boolsuccess=falseintelapsed=0while((!success)&&(elapsed<10000)){Thread.sleep(1000);经过+=1000;success=...someoperation...}我知道有几种方法可以实现这一点,但最基本的是我一遍又一遍地尝试一些事情然后睡觉直到我成功,或者我睡得太久。是否有内置的.net类/方法/等来避免我到处重写这个模式?也许输入是Func(bool)和超时?编辑感谢所有贡献者。我选择sleep()方法是因为它最不复杂而且我完全反对复杂=)这是我的(仍然需要测试)实现:publicstaticboolRetryUntilSuccessOrTimeout(Functask,TimeSpantimeout,TimeSpanpause){if(pause.TotalMilliseconds=0毫秒");}varstopwatch=Stopwatch.StartNew();do{if(task()){returntrue;}Thread.Sleep((int)pause.TotalMilliseconds);}while(stopwatch.ElapsedSomeTask(arg1,arg2),TimeSpan.FromSeconds(10))){//任务成功}您可以使用SpinWait.SpinUntil参见https://msdn.microsoft.com/en-us/library/dd449238(v=vs.110).aspxboolspinUntil=System.Threading.SpinWait.SpinUntil(()=>job.IsDisposed,TimeSpan.FromSeconds(5));你真的不应该使用Sleep()等待要完成的任务。任务完成后,您平均浪费了500毫秒。您应该能够使用任务并行库确定地执行此操作,请参见此处。此示例说明如何使用Wait方法或Task类中的等效方法等待单个任务。它还展示了如何使用静态WaitAll和WaitAny方法等待多个任务。我不知道任何现有的方法,但我认为您可以创建一个接受超时和成功确定功能的方法。像这样:publicstaticboolKeepTrying(inttimeout,Funcoperation){boolsuccess=false;int流逝=0;while((!success)&&(elapsedormaybeyourfunctionaremore"powerful"andyoucanpassit结合灵活的参数:intelapsed=0;while((!success)&&(elapsed其他人提到了线程同步技术,它可以让你等到某个任务完成。但是,如果你想像以前一样保持每秒轮询一次,你可以像这样包装该方法:voidMain(){Timeout(()=>{returnfalse;});}publicvoidTimeout(Funcaction,inttimeout){boolsuccess=false;int流逝=0;while((!success)&&(elapsed您可以抽象缩短代码并概括Timeout:inttimer=0;while(!SomeOperation(...)&&Timeout(reftimer,1000,10000));publicboolTimeout(refinttimer,intincrement,intmaximum){timer+=increment;Thread.Sleep(increment);returntimer第一种解决方案是使用SpinWaitSpinWait.SpinUntil(()=>LoopProcedure(),1000);另一种解决方案是使用Task.Wait()vartask=Task.Run(()=>LoopProcedure());task.Wait(1000);将循环包装到返回boolprivateboolLoopProcedure(){boolsuccess=falsewhile((!success){//dosomestuff...}returnsuccess;}你需要使用Thread.Join。从MSDN,阻塞调用线程直到线程终止,同时继续标准COM和SendMessage提取。如果你想等到指定的时间过去了,使用Thread.Join(TimeSpan)方法。仅限.NET3.0、3.5、4.0。阻塞调用线程,直到线程终止或指定的时间过去,同时继续进行标准COM和SendMessage提取。本教程如何在C#中使用线程会对您有所帮助。以上就是C#学习教程的全部内容:while循环和超时分享的.net结构。如果对你有用,需要了解更多C#学习教程,希望大家多加关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: