无法在尚未创建的控件上调用Invoke或begininvoke

时间:2011-04-05 13:24:49

标签: c# winforms

我有一个普通的Windows Forms应用,但收到以下错误:

Invoke or begininvoke cannot be called on a control which is not yet created.

这在以下代码中发生:

Application.ThreadException += Application_ThreadException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

var args = new string[0];

new MyApp().Run(args);

我正在使用启动画面,我认为这是问题开始的地方。

这是如何解决的?

2 个答案:

答案 0 :(得分:1)

为什么要将参数传递给自己的应用程序? Windows Forms应用程序的默认入口点定义不接受任何参数,因此您是否手动更改了此参数?

解决似乎是你的问题,但请尝试使用它:

Application.Run(new YourMainForm());

所以,最终:

Application.ThreadException += Application_ThreadException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new YourMainForm());

为了检索执行者传递给应用程序的参数,您可以使用公开Environment方法的GetCommandLineArgs类。所以你需要确定这些值吗?A)调用这个方法,解析然后通过属性或类似的东西以强类型格式存储,或者,B)调用这个方法,按需解析,比如,从内部你的表格。

答案 1 :(得分:0)

我刚刚发布的一篇旧帖子 - 看来有一个MS漏洞突然出现,几乎是随机的,尽管有些机器似乎比其他机器更受影响。

感谢Mr Gallagher将我指向MSDN social article并进行了解决。

诀窍是帮助框架实现启动屏幕实际可用时,不要让它隐藏起泡直到它被正确创建。

因此,请添加SplashLoadFinished标记作为用户设置或类似标记。

然后在Splash Form.Load事件中设置此标志(下面的行必须分别是第一行和最后一行):

Private Sub Form_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    My.Settings.SplashLoadFinished = False
    ...
    My.Settings.SplashLoadFinished = True
End Sub

然后在ApplicationEvents Startup事件中放置一个等待循环:

Private Sub MyApplication_Startup(sender As Object, e As ApplicationServices.StartupEventArgs) Handles Me.Startup
...
If (Me.SplashScreen IsNot Nothing) Then
    'Wait until the Splash has actually been created
    While (Not My.Settings.SplashLoadFinished)
        System.Threading.Thread.Sleep(50)
    End While
End If
...