Windows窗体在加载后立即关闭

本文关键字:窗体 加载 Windows | 更新日期: 2023-09-27 18:10:25

由于某种原因,我的windows窗体在我运行程序后立即关闭。我能看到这个表格大约一秒钟,然后它就关闭了。这是我的表单加载方法

private void Form1_Load(object sender, EventArgs e)
    {
        CustGen = new CustomerGenerator(); 
        fuelType = null; 
        //set data on form initialization.
        unleadedtank = 10000f;
        dieseltank = 10000f;
        u_price = 136.9f;
        d_price = 152.2f;
        //event subscriptions
        CustGen.CustomerReady += CustomerReadySub; //Subscribes to ready event
        CustGen.PumpProgress += PumpProgressSub; //subscribes to progress event
        CustGen.PumpingFinished += PumpingFinishedSub; //subscribes to stop event
    }

,这是我的程序。cs为特定的形式,虽然这是自动生成的,我不确定是否需要。

        [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

在customerGenerator类

  public class CustomerGenerator
{
    public CustomerGenerator();
    public event CustomerGenerator.CustomerReadyHandler CustomerReady;
    public event CustomerGenerator.PumpingFinishedHandler PumpingFinished;
    public event CustomerGenerator.PumpProgressHandler PumpProgress;
    public void ActivatePump();
    public void Start();
    public delegate void CustomerReadyHandler(object sender, CustomerReadyEventArgs e);
    public delegate void PumpingFinishedHandler(object sender, EventArgs e);
    public delegate void PumpProgressHandler(object sender, PumpProgressEventArgs e);
}

我运行了这个程序,并在执行下面一位用户在评论中所说的话后遇到了这个问题。

 public void CustomerReadySub(object sender, CustomerReadyEventArgs fuel)
    {
        string CustReady = null;
        //checks what fuel is chosen and then activates the pump
        fuelType = fuel.SelectedFuel.ToString();
        if (!String.IsNullOrEmpty(fuelType))
        {
            fTypeLabel.Text = fuelType;

就是这一行抛出了异常。它还说"跨线程操作无效:控制'Form1'从线程访问,而不是创建它的线程。"

fuelType = fuel.SelectedFuel.ToString();

谢谢

Windows窗体在加载后立即关闭

还说"跨线程操作无效:控制'Form1'从创建它的线程以外的线程访问。"

使用以下模式访问表单上的控件:

private void MyHandler(object sender, EventArgs e) {
  if (InvokeRequired) Invoke(new EventHandler(MyHandler), sender, e);
  else {
    // code to handle the event
  }
}

当你监听在线程上执行的一些对象生成的事件时,处理事件的代码将在该线程上运行。当你从创建UI对象的线程以外的线程访问UI对象时,你会得到一个异常。invokerrequired检查您是否在UI线程上运行,如果不是,则调用该方法在UI线程上运行。这允许您安全地访问控件。