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();
谢谢
还说"跨线程操作无效:控制'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线程上运行。这允许您安全地访问控件。