【发布时间】:2020-04-06 01:24:27
【问题描述】:
我发现自己编写了很多这样的代码来从 BackgroundWorker 更新 UI 线程(_instance 是对 Main 类的引用):
_instance.Invoke((Action)(() =>
{
_instance.DgvResults.DataSource = Results;
_instance.LblStatus.Text = @"Done!";
}));
我想将此块提取到一个方法中,这样我就可以这样调用它:
RunOnUIThread(() => _instance.DgvResults.DataSource = Results);
换句话说,目标是能够将包含我想在 UI 线程上运行的指令的 lambda 传递给此方法。我已经能够在 Java 中做到这一点,但我对 C# 还是很陌生,不知道如何解决这个问题。任何指导将不胜感激。
【问题讨论】:
-
所以 UI 线程正在继续更新 UI 的东西?更新引用某些甚至尚未更改的内容的“每一帧”并不是那么可取...
-
这个后台工作人员对 UI 线程的要求非常低,但我的强迫症患者更愿意将这两个调用替换为对方法的单行调用!
-
在 UI 线程
ProgressChanged和RunWorkerCompleted上执行的 BackgroundWorker 事件中执行函数。后台工作人员访问外部资源(数据库、文件或 Web 服务)的替代方法 - 使用没有后台工作人员的异步方法 -
RunOnUIThread(() => _instance.DgvResults.DataSource = Results)与_instance.Invoke(() => _instance.DgvResults.DataSource = Results)有何不同/更好?在我看来,它们基本上是一样的。如果您将每个语句包装在调用中,这只是一个单行,这实际上会比传统方法更糟糕。如果您真的不喜欢显式调用Invoke(),则应该在不需要的地方使用不同的方法,例如利用BackgroundWorker中现有的跨线程机制或使用WPF(它会自动执行很多操作) -
好电话,我已经将我可以的调用单列起来,并将需要一次发送多个指令的调用保持原样。 “BackgroundWorker 中现有的跨线程机制”指的是什么?
标签: c# methods lambda parameters