为什么有时我'我在Backgroundworker做工作事件InvalidOperationException异
本文关键字:Backgroundworker 工作 事件 InvalidOperationException 我在 为什么 | 更新日期: 2023-09-27 18:19:14
在form1构造器中,我正在做:
buttonSnap.Enabled = false;
backgroundWorker1.RunWorkerAsync();
然后我有一个按钮点击:
private void buttonSnap_Click(object sender, EventArgs e)
{
ClearGraphics = true;
this.listBoxSnap.Items.Clear();
this.pictureBoxSnap.Image = null;
backgroundWorker1.RunWorkerAsync();
buttonSnap.Enabled = false;
}
在backgroundworker do事件中,我正在向listBox添加项目,每个项目都是一个捕获的窗口:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
if (this.IsHandleCreated)
{
listBoxSnap.Invoke(new MethodInvoker(delegate { this.listBoxSnap.Items.Add("Minimized Windows"); }));
listBoxSnap.Invoke(new MethodInvoker(delegate { this.listBoxSnap.Items.AddRange(WindowSnap.GetAllWindows(true, true).ToArray()); }));
}
}
catch (Exception ee)
{
string t = "exception " + ee.ToString();
}
}
这是一个WindowSnap.cs类的链接:
WindowSnap.cs
这是WindowSnapCollection.cs的链接:
WindowSnapCollection.cs
在WindowSnap.cs中有GetallWindows:
方法public static WindowSnapCollection GetAllWindows(bool minimized, bool specialCapturring)
{
windowSnaps = new WindowSnapCollection();
countMinimizedWindows = minimized;//set minimized flag capture
useSpecialCapturing = specialCapturring;//set specialcapturing flag
EnumWindowsCallbackHandler callback = new EnumWindowsCallbackHandler(EnumWindowsCallback);
EnumWindows(callback, IntPtr.Zero);
return new WindowSnapCollection(windowSnaps.ToArray(), true);
}
现在异常有时会在DoWork事件上抛出:
listBoxSnap.Invoke(new MethodInvoker(delegate { this.listBoxSnap.Items.AddRange(WindowSnap.GetAllWindows(true, true).ToArray()); }));
例外是:
在窗口句柄创建之前,不能在控件上调用Invoke或BeginInvoke
完整异常消息:
System.InvalidOperationException was caught
Message=Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
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 MinimizeCapture.Form1.backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e) in c:'Temp'Capture'Form1.cs:line 81
InnerException:
第81行是:
listBoxSnap.Invoke(new MethodInvoker(delegate { this.listBoxSnap.Items.Add("Minimized Windows"); }));
现在我添加在后台工作做工作事件尝试和捕获,有时它停止在字符串t…在catch中。然后我添加了这个:
如果(this.IsHandleCreated)
现在它有时会出现同样的问题,但没有在catch并抛出异常时停止。同样的问题有时会出现,有时会出现异常所描述的问题。
This: if (This . ishandlecreated)没有解决它
您正在检查this.InHandleCreated
,它返回是否为当前实例创建句柄。我想这是一种形式。但是,你立即调用listBoxSnap.Invoke
,这就是问题所在。listBoxSnap
的句柄可能在那时还没有创建。您需要使用listBoxSnap.InHandleCreated
代替。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
if (listBoxSnap.IsHandleCreated)
{
listBoxSnap.Invoke(new MethodInvoker(delegate { this.listBoxSnap.Items.Add("Minimized Windows"); }));
listBoxSnap.Invoke(new MethodInvoker(delegate { this.listBoxSnap.Items.AddRange(WindowSnap.GetAllWindows(true, true).ToArray()); }));
}
}
catch (Exception ee)
{
string t = "exception " + ee.ToString();
}
}
同样,如果这是你的真实代码,你根本不需要BackgroundWorker
。您没有使用工作线程。所有工作仅由主线程完成。
我建议你做以下与你的代码有效相同的事情(因为你的DoWork没有做任何有用的事情)。
buttonSnap.Enabled = false;
this.listBoxSnap.Items.Add("Minimized Windows"); }));
this.listBoxSnap.Items.AddRange(WindowSnap.GetAllWindows(true, true).ToArray());