为什么有时我'我在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)没有解决它

为什么有时我'我在Backgroundworker做工作事件InvalidOperationException异

您正在检查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()); 
相关文章:
  • 没有找到相关文章