質問:
指定されたタイムアウト内で 1 行のコードを実行する汎用メソッドを 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>
使用法:
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# でコードの 1 行に汎用タイムアウトを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。