在C#中实现通用的超时机制
编程中一个常见的需求是能够执行具有指定超时的代码。当处理外部系统或可能需要过长时间才能完成的代码时,这变得至关重要。实现通用的超时机制允许在整个代码库中保持一致的行为,确保以适当的方式处理无响应的代码。
在这种情况下,目标是创建一个通用的方法,该方法可以在指定的超时时间内执行任何给定的代码。解决方案应该优雅地处理代码超过超时的情况,并提供一种停止其执行的机制。
实现此目的的一种优雅方法是使用委托。以下代码片段演示了一个名为CallWithTimeout的通用超时方法,该方法接受一个Action委托和一个以毫秒为单位的超时值:
<code class="language-csharp">static void CallWithTimeout(Action action, int timeoutMilliseconds) { Thread threadToKill = null; Action wrappedAction = () => { threadToKill = Thread.CurrentThread; try { action(); } catch(ThreadAbortException ex){ Thread.ResetAbort();// 取消强制中止,以便更好地完成。 } }; IAsyncResult result = wrappedAction.BeginInvoke(null, null); if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds)) { wrappedAction.EndInvoke(result); } else { threadToKill.Abort(); throw new TimeoutException(); } }</code>
在此方法中,创建一个单独的线程来执行给定的操作。控制执行的关键是使用一个包装的委托,该委托捕获对线程的引用。如果操作超过超时时间,则会优雅地中止线程并抛出TimeoutException。
通过使用这种通用的超时机制,开发人员可以轻松地保护其代码免受无响应的外部系统或代码块的影响。它促进了健壮的应用程序行为,并增强了对潜在异常的处理。
以上是如何在 C# 中实现通用超时机制?的详细内容。更多信息请关注PHP中文网其他相关文章!