您好,登錄后才能下訂單哦!
在C#中,使用Invoke
方法執行異步操作時,可以通過Task.WhenAny
結合異常處理來優雅地處理超時情況。以下是一個示例代碼:
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)
{
// 處理異常,例如記錄日志或顯示錯誤消息
MessageBox.Show($"Error: {ex.Message}");
}
}
else
{
// 超時處理,例如取消操作或顯示超時消息
MessageBox.Show($"Operation timed out after {timeoutMilliseconds} milliseconds.");
}
}
}
在這個示例中,我們創建了一個AsyncInvoker
類,它接受一個Control
和一個MethodInvoker
作為參數。InvokeAsync
方法接受一個timeoutMilliseconds
參數,用于指定操作的超時時間。
在InvokeAsync
方法中,我們首先創建一個Task
對象,表示異步操作。然后,我們使用Task.WhenAny
方法等待異步操作完成或達到指定的超時時間。如果異步操作在超時時間內完成,我們等待它完成并處理可能的異常。如果異步操作超時,我們取消操作并顯示一條超時消息。
要使用這個AsyncInvoker
類,你可以創建一個Control
對象(例如一個Button
)和一個要執行的方法(例如一個void
方法),然后創建一個AsyncInvoker
實例并調用InvokeAsync
方法。例如:
private void button1_Click(object sender, EventArgs e)
{
var asyncInvoker = new AsyncInvoker(this, () =>
{
// 在這里執行你的異步操作
MessageBox.Show("Async operation started.");
Thread.Sleep(2000); // 模擬異步操作耗時
MessageBox.Show("Async operation completed.");
});
asyncInvoker.InvokeAsync(3000).ContinueWith(_ =>
{
// 在這里處理InvokeAsync方法的返回值或異常
});
}
在這個示例中,我們在按鈕的Click
事件處理器中創建了一個AsyncInvoker
實例,并調用InvokeAsync
方法來執行一個模擬的異步操作。我們指定了3000毫秒的超時時間。如果異步操作在超時時間內完成,我們將看到一個消息框顯示“Async operation completed.”。如果異步操作超時,我們將看到一個消息框顯示“Operation timed out after 3000 milliseconds.”。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。