看你写过 JS。JS 里通常有一个很重要的概念,叫**回调函数** ,可以把一个函数当作参数传递给另一个函数: function batch(source, callback) { let progress = 0; source.forEach(item => { progress++; callback && callback(progress); }); } batch(['甲', '乙', '丙', '丁'], (progress) => { console.log(progress); }); 这段代码能理解吧? 在 C# 中也可以实现类似的逻辑,只不过它不叫回调函数,而是叫**委托** 。C# 有两大类委托,一类是没有返回值的(也可以说返回值是 `void`),是 `System.Action`;另一类是有返回值的,是 `System.Func`。 用委托来改写你这段代码的话,就是: public void update(string DBsource, List sqls, Action onUpdateCallback) { string source = "Data Source= " + DBsource; using SqliteConnection sqliteConn = new(source); sqliteConn.Open(); int progress = 0; if (onUpdateCallback != null) onUpdateCallback(progress); foreach (var item in sqls) { SqliteCommand cmd = new(item, sqliteConn); cmd.Prepare(); cmd.ExecuteNonQuery(); progress++; if (onUpdateCallback != null) onUpdateCallback(progress); } } // 外部调用时 update(DbSource, sqls, (progress) => { progressBar1.Value = progress; progressBar1.Maximum = sqls.Count; progressBar1.Visible = progressBar1.Value < progressBar1.Maximum; }); 当然了,这种写法其实很不 OOP。正常的写法应该是定义一个**事件** ,由外部来监听这个事件再做处理。你既然在做 WinForm,那对事件应该不陌生,WinForm 里所有控件的各种触发都是事件。这个代码就不给了,AI 已经给出一段代码了。