.NET 中的异步调用和线程安全控制使用

作者 : 慕源网 本文共983个字,预计阅读时间需要3分钟 发布时间: 2021-11-24 共132人阅读

.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。


慕源网 » .NET 中的异步调用和线程安全控制使用

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录