C# 无法对尚未创建的控件调用Invoke或begininvoke

C# 无法对尚未创建的控件调用Invoke或begininvoke,c#,winforms,C#,Winforms,我有一个正常的Windows窗体应用程序,但出现以下错误: Invoke or begininvoke cannot be called on a control which is not yet created. 这在以下代码中发生: Application.ThreadException += Application_ThreadException; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderi

我有一个正常的
Windows窗体
应用程序,但出现以下错误:

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);
我使用的是闪屏,我认为这就是问题的根源


这是如何解决的?

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

但是,要解决您的问题,请尝试使用以下方法:

Application.Run(new YourMainForm());
因此,最终:

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

Application.Run(new YourMainForm());

为了检索由执行器传递给应用程序的参数,可以使用公开
GetCommandLineArgs
方法的
Environment
类。因此,如果您需要确定这些值,您可以A)调用此方法,通过属性或类似的方式解析并以强类型格式存储,或者B)调用此方法,根据需要解析,比如从表单中解析。

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

但是,要解决您的问题,请尝试使用以下方法:

Application.Run(new YourMainForm());
因此,最终:

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

Application.Run(new YourMainForm());

为了检索由执行器传递给应用程序的参数,可以使用公开
GetCommandLineArgs
方法的
Environment
类。因此,如果您需要确定这些值,您可以A)调用此方法,通过属性或类似的方式解析并以强类型格式存储,或者B)调用此方法,根据需要解析,例如,从表单中解析。

我刚刚找到的一篇旧帖子-似乎有一个MS错误再次出现,虽然有些机器似乎比其他机器受到的影响更严重,但这似乎几乎是随机的

谢谢你给我指了指周围的工作

诀窍是帮助框架实现启动屏幕何时实际可用,方法是在正确创建启动屏幕之前不要让它隐藏启动

因此,添加一个
SplashLoadFinished
标志作为用户设置或类似设置

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

Private子表单\u Load(发送方作为对象,e作为System.EventArgs)处理Me.Load
My.Settings.SplashLoadFinished=False
...
My.Settings.SplashLoadFinished=真
端接头
然后在
ApplicationEvents
Startup
事件中放置一个等待循环:

Private Sub MyApplication\u Startup(发送者作为对象,e作为应用程序服务.StartupEventArgs)处理我。Startup
...
如果(Me.SplashScreen不是什么)那么
'等待,直到实际创建了飞溅
While(不是My.Settings.SplashLoadFinished)
系统线程线程睡眠(50)
结束时
如果结束
...

我刚刚点击的一篇老帖子——似乎有一个微软的bug突然冒了出来,看起来几乎是随机的,尽管有些机器似乎比其他机器受到的影响更严重

谢谢你给我指了指周围的工作

诀窍是帮助框架实现启动屏幕何时实际可用,方法是在正确创建启动屏幕之前不要让它隐藏启动

因此,添加一个
SplashLoadFinished
标志作为用户设置或类似设置

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

Private子表单\u Load(发送方作为对象,e作为System.EventArgs)处理Me.Load
My.Settings.SplashLoadFinished=False
...
My.Settings.SplashLoadFinished=真
端接头
然后在
ApplicationEvents
Startup
事件中放置一个等待循环:

Private Sub MyApplication\u Startup(发送者作为对象,e作为应用程序服务.StartupEventArgs)处理我。Startup
...
如果(Me.SplashScreen不是什么)那么
'等待,直到实际创建了飞溅
While(不是My.Settings.SplashLoadFinished)
系统线程线程睡眠(50)
结束时
如果结束
...

此代码片段不是很有用,也不完整,是否要重试?如果您将
new MyApp().Run(args)
行取出,应该可以解决问题;或者更有用一点,@Lazarus说,这可能就是它的开始。不发布代码==无解决方案。使用内置的.NET对启动屏幕的支持,而不是自己制作:此代码片段不是很有用,也不完整,是否要重试?如果您使用
new MyApp().Run(args)
行,应该可以解决问题;或者更有用一点,@Lazarus说,这可能就是它的开始。不发布代码==无解决方案。使用内置的.NET对启动屏幕的支持,而不是自己制作:之所以这样做,是因为启动屏幕是如何被调用的。启动屏幕不是一个
表单
?用一个
新的
闪屏表单实例启动应用程序。我刚刚试过,但是关闭它并显示主表单的最佳方法是什么?我不能得到一个可靠的转换,他们似乎都关闭等,很难给你一个理想的解决方案,因为我不知道你的项目,这里有有限的时间和空间,但一种方法是让你的启动屏幕做任何需要做的加载前加载主窗体;另一种方法是最初加载主窗体,显示启动屏幕,隐藏主窗体,隐藏启动屏幕,然后重新显示主窗体-显然,所有这些都是适当的时间。这一行的原因是启动屏幕是如何调用的。启动屏幕不是一个
窗体
?使用
new
splash启动应用程序