c# - Control.Invoke() 挂起应用程序

标签 c# .net winforms multithreading

我正在显示动画,而我的控件正在加载数据。当线程完成时,我隐藏动画并显示控件。所以我从一个线程执行这段代码:

protected void InvokeEnableBackControl()
{
    if (this.InvokeRequired)
    {                
        this.Invoke(new OpHandler(EnableBackControl));
    }
    else
    {
        EnableBackControl();
    }
}

有时,当我执行这段代码时,主线程会在以下代码中挂起:

protected virtual void EnableBackControl()
{
    if (overlayAnimation.TargetControl != null)
    {
        overlayAnimation.TargetControl.BringToFront();
    }

    overlayAnimation.SendToBack();
    overlayAnimation.Enabled = false;
    overlayAnimation.Visible = false;                      

我不确定设置 EnableVisible 属性是否挂起。您是否知道任何可能使应用程序从 Control.Invoke 调用这些属性的情况?

最佳答案

请注意 Control.Invoke 是同步的,因此它将等待 EnableBackControl() 返回。考虑使用 Control.BeginInvoke,您可以“触发后忘记”。

查看此答案:What's the difference between Invoke() and BeginInvoke()

关于c# - Control.Invoke() 挂起应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5119263/

相关文章:

c# - 如何在 WebMethod 中获取调用方的 IP 地址?

.net - 在 where 子句中使用 Array 进行 Linq 查询?

c# - 每第 N 个字符/数字拆分一个字符串/数字?

c# - 如何在 app.config 中注册命名空间

c# - 在 C# winform 中的文本上放置阴影

c# - 如何关闭表单并重新打开它?

c# - 使用 LINQ 将一个列表复制到另一个列表和子列表

c# - 以编程方式(在 c# 中)在页面上调用 Javascript,然后将其提交回服务器

c# - OOP中级教程

c# - 通过 for 循环初始化带有 Lists<int> 的交错数组