【发布时间】:2010-10-22 23:20:30
【问题描述】:
我有一个类似于Greg D discusses here 的 SafeInvoke Control 扩展方法(减去 IsHandleCreated 检查)。
我从System.Windows.Forms.Form 调用它如下:
public void Show(string text) {
label.SafeInvoke(()=>label.Text = text);
this.Show();
this.Refresh();
}
有时(此调用可能来自多个线程)这会导致以下错误:
System.InvalidOperationException发生
Message= "在创建窗口句柄之前,不能对控件调用 Invoke 或 BeginInvoke。"
Source= "System.Windows.Forms"StackTrace: at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous) at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) at System.Windows.Forms.Control.Invoke(Delegate method) at DriverInterface2.UI.WinForms.Dialogs.FormExtensions.SafeInvoke[T](T control, Action`1 action) in C:\code\DriverInterface2\DriverInterface2.UI.WinForms\Dialogs\FormExtensions.cs:line 16
发生了什么,我该如何解决?我知道这不是表单创建的问题,因为有时它会工作一次,下一次会失败,那么问题是什么?
PS。我真的很不擅长 WinForms,有没有人知道解释整个模型以及如何使用它的一系列好文章?
【问题讨论】:
-
链接发生了一些奇怪的事情......标记和预览是正确的......奇怪。
-
Show 在什么上下文中被调用?它是否曾经从表单的构造函数中调用过,例如?根据 HandleCreated 事件触发的消息记录调用 show 的消息可能很有用,以验证您仅在已创建句柄的对象上调用 show。
-
应用程序的用途/设计方式是什么? this.Show() 有什么作用? (我假设它不仅仅是 this.Visible = true;)你对 webforms 的引用是错字吗?
-
this.Show() 是基本的 Form.Show() 所以不管它做什么。对话框永远不会从构造函数中调出。它由具有简单 Notify(string) 方法的 INotifier 服务的实现调用
-
再看一遍,一年多之后,您似乎正是因为存在
IsHandleCreated检查而遇到了错误。您正在尝试更改尚未创建的控件的 (Send a message to) 属性。在这种情况下,您可以做的一件事是将在创建控件之前提交的委托排队,然后在HandleCreated事件中运行它们。