c# - .net 构造 for while 循环超时

标签 c# .net .net-4.0 .net-2.0

我通常使用 while 循环来继续尝试某些操作,直到操作成功或超时结束:

bool success = false
int elapsed = 0
while( ( !success ) && ( elapsed < 10000 ) )
{
     Thread.sleep( 1000 );
     elapsed += 1000;
     success = ... some operation ...     
}

我知道有几种方法可以实现这一点,但基本要点是我反复尝试一些 sleep 操作直到成功,或者我睡得太久了。

是否有一个内置的 .net 类/方法/等来避免我到处重写这个模式?也许输入是一个 Func(of bool) 和超时?

编辑
感谢所有贡献者。我选择了 sleep() 方法,因为它最不复杂,而且我完全反对复杂性 =) 这是我的(仍然需要测试的)实现:

 public static bool RetryUntilSuccessOrTimeout( Func<bool> task , TimeSpan timeout , TimeSpan pause )
    {

        if ( pause.TotalMilliseconds < 0 )
        {
            throw new ArgumentException( "pause must be >= 0 milliseconds" );
        }
        var stopwatch = Stopwatch.StartNew();
        do
        {
            if ( task() ) { return true; }
            Thread.Sleep( ( int )pause.TotalMilliseconds );
        }
        while ( stopwatch.Elapsed < timeout );
        return false;
    }

最佳答案

您可以使用 SpinWait.SpinUntil

参见 https://msdn.microsoft.com/en-us/library/dd449238(v=vs.110).aspx

bool spinUntil = System.Threading.SpinWait.SpinUntil(() => job.IsDisposed, TimeSpan.FromSeconds(5));

关于c# - .net 构造 for while 循环超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6629219/

相关文章:

c# - .NET 和 TK 之间是否有任何绑定(bind)

Java 客户端连接到 SignalR?

c# - 对数字的原子等待然后执行操作

C#/WPF - 重新编译 SilverLight 4 工具包以用于 WPF 应用程序是否可行?

c# - 等待 AuthenticationManager.GetExternalLoginInfoAsync() 返回 null

c# - MessageBox展开按钮以获取进一步的错误描述

.net - 使用 MS Access querydef 将参数作为 Decimal 类型传递时,PARAMETER 子句中出现语法错误

c# - 如何在 Web 测试插件中调用 MoveDataTableCursor 来浏览表中有限的行集?

c++ - 在 .NET Web 应用程序中重用 C++/CLI 用户控件

c# - 数据源未添加到 ReportViewer