Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Melaksanakan Tamat Masa Generik untuk Satu Baris Kod dalam C#?
Soalan:
Bagaimana untuk mencipta kaedah generik dalam C# yang melaksanakan satu baris kod dalam tamat masa tertentu? Ini berguna untuk bekerja dengan kod yang tidak boleh diubah suai dan boleh menyebabkan masalah, dan untuk menamatkan pelaksanaan kod pada tamat masa.
Jawapan:
Melaksanakan pengendali tamat masa generik memerlukan pertimbangan yang teliti, terutamanya dari segi menghentikan kod bermasalah selepas tamat masa. Penyelesaian berikut menggabungkan ungkapan lambda dan benang.
Kaedah kunci ialah CallWithTimeout
yang menerima kod untuk dilaksanakan (wakil Action
) dan tamat masa yang diingini dalam milisaat.
Pelaksanaan:
<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>
Penggunaan:
KaedahCallWithTimeout
boleh digunakan seperti berikut:
<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>
Dalam contoh ini, FiveSecondMethod
akan berjalan dengan jayanya dalam tamat masa 6 saat, tetapi akan membuang TimeoutException
pengecualian dalam tamat masa 4 saat.
Nota:
Kod di atas membatalkan urutan tamat masa dengan menggugurkan urutan, yang mungkin tidak sesuai dalam sesetengah kes. Jika kaedah pembatalan yang lebih elegan diperlukan, mekanisme lain boleh dilaksanakan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Tamat Masa Generik untuk Satu Baris Kod dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!