我正在寻找一个通用的尝试和重试与超时在C#.基本上,我想要以下:
bool stopTrying = false;
DateTime time = DateTime.Now;
while (!stopTrying)
{
try
{
//[Statement to Execute]
}
catch (Exception ex)
{
if (DateTime.Now.Subtract(time).Milliseconds > 10000)
{
stopTrying = true;
throw ex;
}
}
}
在上面的例子中,我等待了10秒钟,但它应该是一个基于参数的变量timeout。我不想在需要使用它的地方重复完整的代码。在我的代码中有很多地方没有内置到API中的超时,如果应用程序没有准备好执行语句,我会遇到异常。这也将避免在这些满足之前在我的应用程序中硬编码延迟。
**说明:**这里的语句可能是赋值语句,如果我使用委托和方法.Invoke,调用的作用域不是在委托内部,而不是在原始方法内部吗?
7条答案
按热度按时间gv8xihay1#
使用您的示例,解决方案很简单:
只需调用
DoOrTimeout
,并将delegate作为第一个参数。mrwjdhj32#
这不是最漂亮的东西,但到目前为止我似乎工作得很好,而且它没有使用异常来指示超时。
用法
ssgvzors3#
看一下这个问题,你的要求正是我打算的用途之一。
Implement C# Generic Timeout
警告:此示例使用Thread.Abort。请点击我最初问题的链接,阅读评论中关于此问题的一些警告。
只需在一个循环中运行此代码,并使用适当的超时控制。
abithluo4#
创建一个方法,该方法接受一个lambda表达式作为Statement To Execute,接受一个参数作为timeout。在该方法中,在try / catch块中执行lambda表达式,并使用参数作为timeout。
p8h8hvxi5#
这里有一个简单的解决方案:
klh5stk16#
这段代码是错误的(无限循环):
正确的是:
wlwcrazw7#
这是我使用的解决方案,this answer的改进版本。
示例用法: