C# 在创建窗口句柄之前,无法对控件调用Invoke或BeginInvoke

C# 在创建窗口句柄之前,无法对控件调用Invoke或BeginInvoke,c#,wcf,invoke,C#,Wcf,Invoke,嘿,伙计们,当我的应用程序关闭时,我会遇到这个异常。CustomerReadySub是我已订阅的活动 错误发生在这一行 fTypeLabel.Invoke(new MethodInvoker(fuelTypeChosen)); public void CustomerReadySub(object sender, CustomerReadyEventArgs fuel) { // code to handle the event stri

嘿,伙计们,当我的应用程序关闭时,我会遇到这个异常。CustomerReadySub是我已订阅的活动

错误发生在这一行

fTypeLabel.Invoke(new MethodInvoker(fuelTypeChosen));

public void CustomerReadySub(object sender, CustomerReadyEventArgs fuel)
    {
            // code to handle the event
            string CustReady = null;

            //checks what fuel is chosen and then activates the pump
            fuelType = fuel.SelectedFuel.ToString();

            if (!String.IsNullOrEmpty(fuelType))
            {
                fTypeLabel.Invoke(new MethodInvoker(fuelTypeChosen));

                if (fuelType == "Unleaded") //checks fuel type and displays price accordingly
                {
                    pplText.Invoke(new MethodInvoker(petrol));
                }
                else
                {
                    pplText.Invoke(new MethodInvoker(diesel));
                }

                CustReady = "READY";
                WCFPump.sendReady(CustReady);
            }

            while (WCFPump.getOK() == 0) { /*do nothing*/} //used to loop around until OK is retrieved
            if (pumpID == WCFPump.getOK())
            {
                CustGen.ActivatePump();
            }

    }

    private void fuelTypeChosen()
    {
        fTypeLabel.Text = fuelType;
    }

我真的不确定是什么导致了这个问题。

错误似乎很明显,除了“直到”部分,当您已经关闭时。我认为您也可以将其理解为“在销毁窗口句柄后,不能对控件调用Invoke或BeginInvoke”

因此,您的事件在窗口被破坏后激发。负责这一点的实际代码没有发布,但我们确实看到的代码非常乐意在繁忙的等待中完成。显然,您对Windows事件机制的干扰足以导致此计时问题

短修复:

      if (! fTypeLabel.IsHandleCreated) return;  // emergency exit
      fTypeLabel.Invoke(new MethodInvoker(fuelTypeChosen));

<>但您确实应该考虑修复代码的同步性。使用事件和异步。

除了“直到”部分,当您已经关闭时,错误似乎很明显。我认为您也可以将其理解为“在销毁窗口句柄后,不能对控件调用Invoke或BeginInvoke”

因此,您的事件在窗口被破坏后激发。负责这一点的实际代码没有发布,但我们确实看到的代码非常乐意在繁忙的等待中完成。显然,您对Windows事件机制的干扰足以导致此计时问题

短修复:

      if (! fTypeLabel.IsHandleCreated) return;  // emergency exit
      fTypeLabel.Invoke(new MethodInvoker(fuelTypeChosen));
<>但您确实应该考虑修复代码的同步性。使用事件和异步