我是一个狂热的开发者,而不是一个专业的开发者,因此我对为什么有些问题是这样的没有高度的技术理解。最近,我一直在研究应用程序,我一直在尝试通过使用后台工作程序来处理各种数据库调用来提高响应能力。
后台工作人员完成后,我需要更新 UI,因此我通常会执行以下操作:
private delegate void safeSetTextDelegate(Control control, string text);
public static void SafeSetText(this Control control, string text)
{
if(control.InvokeRequired)
{
safeSetTextDelegate _delegate = new safeSetTextDelegate(SafeSetText);
control.Invoke(_delegate, new object[] { control, text});
}
else
{
control.Text = text;
}
}
现在,显然这有效。但是随着我发现我需要的扩展方法的数量开始增长(我有它们用于设置样式、动态添加子控件、向 datagridviews 添加行等),我想知道为什么没有一组标准方法可用.Net WinForms 语言/模型用于这些类型的事情,甚至为什么 InvokeRequired 检查不会在幕后自动进行并且根据需要应用委托(我的猜测是这是一个性能问题 - 为什么要检查调用在大多数情况下根本不需要线程)。我试图对此进行研究,但没有找到任何体面的答案。
如果我将其总结为一组问题:
- 我的方法中是否有任何固有的坏/错误(后台工作人员通过检查的扩展方法更新控件
InvokeRequired
) - 我在想为什么 .Net WinForms 中的各种方法不能自动
InvokeRequired
进行正确的检查(调用 InvokeRequired 有多少开销)? - 同样,.Net WinForms 规范中不存在用于常见 UI 更新的线程安全方法是否有原因?