public partial class Form2 : Form
{
public Form2() { InitializeComponent(); }
public delegate void SetProgressCallback(int total, int current);
public void SetProgress(int total, int current)
{
if (this.InvokeRequired)
{
try
{
this.Invoke(new SetProgressCallback(SetProgress), total, current);
}
catch { /* 忽略視窗關閉時的例外 */ }
}
else
{
progressBar1.Maximum = total;
progressBar1.Value = current;
}
}
private void button1_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
}
模式解析:
SetProgressCallback 匹配目標方法簽章。SetProgress 中檢查 InvokeRequired:若在非 UI 執行緒,透過 Invoke 封送回 UI 執行緒執行;否則直接更新控件。try-catch 防止視窗已關閉時 Invoke 拋出例外。此模式適用於所有跨執行緒更新 WinForm 控件的情境。