問題:
如何在C#中建立一個通用的方法,以便在給定逾時時間內執行單行程式碼?這對於處理那些無法修改且可能出現問題的程式碼非常有用,並且能夠在逾時時終止程式碼執行。
答案:
實作通用的超時處理程序需要仔細考慮,尤其是在逾時後停止問題程式碼方面。以下解決方案結合了lambda表達式和線程處理。
關鍵方法是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>
用法:
CallWithTimeout
方法可以如下使用:
<code class="language-csharp"> static void Main(string[] args) { // 调用一个执行时间为5秒的方法,设置6秒的超时时间 CallWithTimeout(FiveSecondMethod, 6000); // 调用同一个方法,设置4秒的超时时间,这将触发超时异常 CallWithTimeout(FiveSecondMethod, 4000); } static void FiveSecondMethod() { Thread.Sleep(5000); }</code>
在這個例子中,FiveSecondMethod
在6秒的超時時間內能夠成功運行,但在4秒的超時時間內將拋出一個TimeoutException
異常。
注意:
上面的程式碼透過中止線程來取消超時線程,這在某些情況下可能並不理想。如果需要更優雅的取消方式,可以實現其他機制。
以上是如何在 C# 中實作單行程式碼的通用逾時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!