Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Melaksanakan Tamat Masa Generik untuk Satu Baris Kod dalam C#?

Bagaimanakah Saya Boleh Melaksanakan Tamat Masa Generik untuk Satu Baris Kod dalam C#?

Barbara Streisand
Barbara Streisandasal
2025-01-23 12:06:17973semak imbas

How Can I Implement a Generic Timeout for a Single Line of Code in C#?

Melaksanakan mekanisme tamat masa kod universal 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:

Kaedah

CallWithTimeout 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn