溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C# Invoke如何優(yōu)雅地處理超時(shí)情況

發(fā)布時(shí)間:2024-10-15 09:58:58 來(lái)源:億速云 閱讀:78 作者:小樊 欄目:編程語(yǔ)言

在C#中,使用Invoke方法執(zhí)行異步操作時(shí),可以通過(guò)Task.WhenAny結(jié)合異常處理來(lái)優(yōu)雅地處理超時(shí)情況。以下是一個(gè)示例代碼:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

public class AsyncInvoker
{
    private readonly Control _control;
    private readonly MethodInvoker _method;

    public AsyncInvoker(Control control, MethodInvoker method)
    {
        _control = control;
        _method = method;
    }

    public async Task InvokeAsync(int timeoutMilliseconds)
    {
        var task = (Task)_control.Invoke(_method);
        var completedTask = await Task.WhenAny(task, Task.Delay(timeoutMilliseconds));

        if (completedTask == task)
        {
            try
            {
                await task;
            }
            catch (Exception ex)
            {
                // 處理異常,例如記錄日志或顯示錯(cuò)誤消息
                MessageBox.Show($"Error: {ex.Message}");
            }
        }
        else
        {
            // 超時(shí)處理,例如取消操作或顯示超時(shí)消息
            MessageBox.Show($"Operation timed out after {timeoutMilliseconds} milliseconds.");
        }
    }
}

在這個(gè)示例中,我們創(chuàng)建了一個(gè)AsyncInvoker類(lèi),它接受一個(gè)Control和一個(gè)MethodInvoker作為參數(shù)。InvokeAsync方法接受一個(gè)timeoutMilliseconds參數(shù),用于指定操作的超時(shí)時(shí)間。

InvokeAsync方法中,我們首先創(chuàng)建一個(gè)Task對(duì)象,表示異步操作。然后,我們使用Task.WhenAny方法等待異步操作完成或達(dá)到指定的超時(shí)時(shí)間。如果異步操作在超時(shí)時(shí)間內(nèi)完成,我們等待它完成并處理可能的異常。如果異步操作超時(shí),我們?nèi)∠僮鞑@示一條超時(shí)消息。

要使用這個(gè)AsyncInvoker類(lèi),你可以創(chuàng)建一個(gè)Control對(duì)象(例如一個(gè)Button)和一個(gè)要執(zhí)行的方法(例如一個(gè)void方法),然后創(chuàng)建一個(gè)AsyncInvoker實(shí)例并調(diào)用InvokeAsync方法。例如:

private void button1_Click(object sender, EventArgs e)
{
    var asyncInvoker = new AsyncInvoker(this, () =>
    {
        // 在這里執(zhí)行你的異步操作
        MessageBox.Show("Async operation started.");
        Thread.Sleep(2000); // 模擬異步操作耗時(shí)
        MessageBox.Show("Async operation completed.");
    });

    asyncInvoker.InvokeAsync(3000).ContinueWith(_ =>
    {
        // 在這里處理InvokeAsync方法的返回值或異常
    });
}

在這個(gè)示例中,我們?cè)诎粹o的Click事件處理器中創(chuàng)建了一個(gè)AsyncInvoker實(shí)例,并調(diào)用InvokeAsync方法來(lái)執(zhí)行一個(gè)模擬的異步操作。我們指定了3000毫秒的超時(shí)時(shí)間。如果異步操作在超時(shí)時(shí)間內(nèi)完成,我們將看到一個(gè)消息框顯示“Async operation completed.”。如果異步操作超時(shí),我們將看到一個(gè)消息框顯示“Operation timed out after 3000 milliseconds.”。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI