如何使用 Invoke 或 BeginInvoke 方法处理 Windows 窗体中的控件



我得到以下异常:

窗口出现之前,无法在控件上调用调用 Invoke 或 BeginInvoke 已创建句柄。

我正在使用更好的列表查看器和dotnetbar只是修改此代码注册表清理器,但我正在尝试以另一种形式调用所有类和控件,而不是主要形式。

这是我的代码

public Registry_Scan()
{
InitializeComponent();
StartScanning GeekStartCleaning = StartScanning.GeekCreateControl();
GeekStartCleaning.GeekOnAllScanComplete += GeekOnScanComplete;
this.GeekPanel.Controls.Add(GeekStartCleaning);
}
ScanComplete GeekOnComplete = new ScanComplete();
public void GeekOnScanComplete(ref List<BetterListViewGroup> _GeekListOfGroupTargets)
{
List<BetterListViewGroup> GeekListOfGroupTargets = _GeekListOfGroupTargets;
GeekOnComplete.GeekAddRangeTargets(ref GeekListOfGroupTargets);
GeekOnComplete.Show();
this.GeekPanel.Invoke(new MethodInvoker(() =>
{
this.GeekPanel.Controls.Clear();
this.GeekPanel.Controls.Add(GeekOnComplete);
}));
}

我不知道出了什么问题,请帮忙

System.InvalidOperationException HResult=0x80131509 在创建窗口句柄之前,无法在控件上调用消息 = 调用或开始调用。 Source=System.Windows.Forms 堆栈跟踪: at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean sync) at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) at System.Windows.Forms.Control.Invoke(Delegate method) at GeekCleaner.Registry_Scan.GeekOnScanComplete(List'1& _GeekListOfGroupTargets) in C:\Users\RamRo\source\repos\GeekVersion1\GeekCleaner\GeekCleaner\RegistryScan.cs:line 34 at GeekCleaner.UserPanel.StartScanning.GeekStartScanning() in C:\Users\RamRo\source\repos\GeekVersion1\GeekCleaner\GeekCleaner\UserPanel\StartScanning.cs:line 139 在System.Threading.ThreadHelper.ThreadStart_Context(对象状态) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

我无法从您的代码中真正判断出问题到底是什么。但这肯定会是一个多任务处理的问题。

异常很容易在一个非常简单的应用程序中重现,只需在初始化组件调用之前调用Invoke。

由于您显示的所有代码看起来都是同步的并且超出了Registry_Scan的初始化组件,因此我认为问题不存在。

因此,您应该检查StartScanning.GeekCreateControl()和其他调用是否存在可能的多任务问题,这将在初始化组件之前触发调用,如下所示:

public partial class Form1 : Form
{
public Form1()
{
Task.Factory.StartNew(() =>
{
this.Invoke(new Action(() =>
{
this.Text = "UI Change";
}));
});
InitializeComponent();
}
}

希望这有帮助

我认为有InvokeRequired属性来检查表单是否需要调用?

所以应该是这样的:

if(this.GeekPanel.InvokeRequired)
{
this.GeekPanel.Invoke(new MethodInvoker(() =>
{
this.GeekPanel.Controls.Clear();
this.GeekPanel.Controls.Add(GeekOnComplete);
}));
}
else
{
this.GeekPanel.Controls.Clear();
this.GeekPanel.Controls.Add(GeekOnComplete);
}

最新更新