0

嘿伙计们,当我的应用程序关闭时,我得到了这个异常。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;
    }

我不确定是什么导致了问题。

4

1 回答 1

5

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

因此,您的事件会在 Window 被销毁后触发。实际负责的代码没有发布,但我们看到的代码真的很乐意做忙等待。因此,显然您对 Windows 事件机制的干扰足以导致此时间问题。

简短的修复:

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

但是您应该真正考虑修复代码的同步性质。使用事件和异步。

于 2013-05-06T12:31:44.293 回答