当前位置: 首页 > 编程语言 > C#

在有返回值的函数上实现超时分享

时间:2023-04-10 15:31:34 C#

在有返回值的函数上实现超时.我正在使用Commstudioexpress(我正在Commstudio中实现一个类),但它的超时功能似乎根本不起作用,所以我正在尝试实现我自己的超时。目前我有一个计时器,它被设置为根据请求读取或写入端口,如果计时器关闭,回调将关闭导致异常的连接。我试图让计时器的回调抛出异常,但异常需要通过调用原始读/写函数的线程传播,所以这种方式有效,但我发现它很混乱,必须有更好的方法方法来做我想要的。这是一个通用的解决方案,允许您在超时中包装任何方法:http://kossovsky.net/index.php/2009/07/csharp-how-to-limit-method-execution-time/使用An接受超时(以毫秒为单位)而不是手动使用计时器的Thread.Join重载。我唯一不同的是交换成功标志和结果值以匹配TryParse模式,如下所示:publicstaticTExecute(Funcfunc,inttimeout){Tresult;TryExecute(功能,超时,结果);返回结果;}publicstaticboolTryExecute(Funcfunc,inttimeout,outTresult){vart=default(T);varthread=newThread(()=>t=func());线程。开始();varcompleted=thread.Join(超时);如果(!完成)thread.Abort();结果=t;返还完成;这是你如何使用它:varfunc=newFunc(()=>{Thread.Sleep(200);return"success";});字符串结果;Debug.Assert(!TryExecute(func,100,outresult));调试断言(结果==空);Debug.Assert(TryExecute(func,300,输出结果));Debug.Assert(结果==“成功”);如果要执行不返回值的方法,还可以添加接受Action而不是Func的重载。听起来您正在执行阻塞读/写。你想要做的是非阻塞读/写。可以告诉com端口你想要非阻塞。您确定超时不适用于commstudio吗?也许你必须做一些特别的事情来初始化它们。在任何情况下,如果没有超时可用(取决于超时值),您都希望读取尽可能多的数据。如果没有数据可用且没有错误,您将希望继续循环,然后如果没有可用数据则返回超时条件。使读取函数返回一个整数。负值=假值-1=超时,正在读取的字节数...至少我是这样做的。对于comport,您可以测试是否有任何可用内容,然后进行读取而不是进行阻塞读取并且不知道那里还有什么。类似于:Int32超时=1000;字符串结果=String.Empty';while(timeout!=0){if(Serial.BytesToRead>0){while(Serial.BytesToRead>0){result+=Serial.ReadChar();}休息;}Thread.Sleep(1);暂停-;如果有人想在VB.Net中做这件事,不要听信那些说做不到的人!您可能需要更改通用参数以适合您的用例。公共共享函数Execute(OfI,R)(FuncAsFunc(OfI,R),InputAsI,TimeOutAsInteger)AsRDimResultAsRTryExecute(Func,Input,TimeOut,Result)ReturnResultEndFunctionPublic共享函数TryExecute(OfI,R)(FuncAsFunc(OfI,R),InputAsI,TimeOutAsInteger,ByRefResultAsR)AsBooleanDimOutParamAsR=NothingDimThreadAsNewSystem.Threading.Thread(Sub()InlineAssignHelper(OutParam,Func(Input)))Thread.IsBackground=TrueThread.Start()DimCompletedAsBoolean=Thread.Join(TimeOut)如果未完成则Thread.Abort()Result=OutParamReturnCompletedEndFunctionPrivateSharedFunctionInlineAssignHelper(OfT)(ByRefTargetAsT,ByValValueAsT)AsTTarget=ValueReturnValueEndFunction以及如何使用它的示例(如果模式包含太多Wild,我的是Regex.Match卡,有时永远登陆不了:以上是C#学习教程:实现返回值函数的超时共享,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注给它。—公共函数Match(InputAsString)AsMatchIfRegexIsNothingThenReturnNothingDimRegexMatchAsSystem.Text.RegularExpressions.Match=NothingDimFuncAsNewFunc(OfString,System.Text.RegularExpressions.Match)(Function(xAsString)Regex.Match(x))IfRuntime.TryExecute(OfString,System.Text.RegularExpressions.Match)(Func,Input,2000,RegexMatch)ThenReturn(NewMatch(Me,Regex.Match(Input),Input))ElseReturnNothingEndIfEndFunction本文收集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除,如需转载请注明出处: