.NET 中的异步调用和线程安全控制使用
介绍
对 Windows 窗体控件使用异步编程时,需要记住后台线程不能直接调用不是由它们创建的控件。如果希望在后台线程中操作控件,首先需要检查对控件的调用是否安全,然后再调用它。为此,您可以结合使用 InvokeRequired 属性和 Control 类的 Invoke() 方法。
InvokeRequired 属性的工作
如果当前线程是创建控件的线程并且不需要特殊调用来使用控件,则 InvokeRequired 属性返回 false。如果正在从不同于创建控件的线程访问控件并且必须使用 Invoke() 方法调用该控件,则该属性返回 true。下面的代码演示了这一点,
public delegate void SetColorDelegate()
public void setColor() {
MessageBox.Show(pnlstatus.InvokeRequired.ToString());
if (pnlStatus.InvokeRequired) {
Set ColorDelegate del = new SetColorDelegate(SetColor);
this.Invoke(del);
} else {
pnlStatus.BackColor = Color.Tomato;
}
}
private void bgWrkrDownload_DoWork(object sender, DoWorkEventArgs e) {
//some background action
set Color();
}
当后台任务进行时,面板背景颜色需要改变。但是,如果您尝试通过后台线程直接访问面板控件,则可能会出现错误,因为控件的所有者与调用它的所有者不同。为避免该错误,您检查 InvokeRequired 属性并为包含操作的方法创建一个委托,并使用该委托调用 Invoke。在 Invoke 中,您将委托传递给将实际执行控件所需操作的方法。例如,在这种情况下,您要更改面板的背景颜色。您不是直接执行此操作,而是在名为 SetColor() 的方法中更改它并在 DoWork 事件处理程序中调用 SetColor()。这样,您就可以确保对控件进行线程安全调用。
概括
如果当前线程是创建控件的线程并且不需要特殊调用来使用控件,则 InvokeRequired 属性返回 false。使用 InvokeRequired 属性并为包含操作的方法创建一个委托,并使用该委托调用 Invoke。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!