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

Bagaimanakah Saya Boleh Melaksanakan Mekanisme Tamat Masa Generik untuk Pelaksanaan Kod dalam C#?

Susan Sarandon
Lepaskan: 2025-01-23 12:01:12
asal
984 orang telah melayarinya

How Can I Implement a Generic Timeout Mechanism for Code Execution in C#?

Mekanisme Tamat Masa Pelaksanaan Kod Universal C#: Panduan Lengkap

Dalam pembangunan perisian, mengawal masa pelaksanaan blok kod adalah penting, terutamanya apabila menangani kebergantungan luaran yang tidak boleh dipercayai atau memakan masa seperti panggilan API atau pertanyaan pangkalan data. Untuk melakukan ini, cara biasa untuk menetapkan tamat masa untuk satu baris kod diperlukan.

Melaksanakan mekanisme tamat masa universal

Inti membina mekanisme tamat masa universal adalah untuk menamatkan kod jangka panjang dan memintas kemungkinan ralat. Untuk ini kita boleh menggunakan penyelesaian berlapis:

  • Wakil Berbalut: Mencipta perwakilan yang menangkap kod sasaran dan menyediakan akses kepada pemegang benang.
  • Kaedah Pelaksanaan Tamat Masa: Mencipta kaedah (seperti CallWithTimeout) yang menerima operasi dan tempoh tamat masa sebagai input. Kaedah ini memulakan pelaksanaan kod pada urutan yang berasingan dan melampirkan perwakilan pembalut untuk menjejaki kemajuan.
  • Penamatan Benang: Apabila tamat masa, tamatkan urutan yang bertanggungjawab untuk kod berjalan lama dan buang TimeoutException.

Kendalian praktikal

Berikut ialah butiran pelaksanaan khusus:

<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        // 设置 6000 毫秒(6 秒)的超时
        CallWithTimeout(FiveSecondMethod, 6000);

        // 设置 4000 毫秒(4 秒)的超时
        CallWithTimeout(FiveSecondMethod, 4000);
    }

    static void FiveSecondMethod()
    {
        Thread.Sleep(5000);
    }
}

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>
Salin selepas log masuk

Pelaksanaan ini membolehkan anda melaksanakan kod dengan tamat masa yang ditakrifkan dengan baik sambil memberikan fleksibiliti dan kawalan yang elegan ke atas pelaksanaan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Mekanisme Tamat Masa Generik untuk Pelaksanaan Kod dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan