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
Susan Sarandonasal
2025-01-23 12:01:12983semak imbas

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>

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!

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