我花了5天时间试图解决这个问题,但我失败了。
我是c#的新手,我使用的是Windows窗体。我构建了一个由20个表单组成的应用程序。该应用程序以2 forms
(SplashScreen
和MainForm
)开头,SplashScreen
表单有一个计时器和ProgressBar,MainForm
有10个按钮,每个按钮打开其他形式。当此应用程序运行时,首先加载SplashScreen
表单,当progressBar
完成时,它会检查System.txt
文件是否存在,如果存在则加载MainForm
表单:< / p>
SplashScreen表格:
public partial class SplashScreen : Form
{
// This is a timer for progressBar:
private void timer1_Tick(object sender, EventArgs e)
{
progressBar1.Increment(1);
if(progressBar1.Value==100)
{
timer1.Stop(); //it stops when progressBar completes.
CheckFile(); // this method will be called when progressBar completes
}
}
public void CheckFile()
{
if (File.Exists(@"C:\Folder1\System.txt"))
{
// if the file exist Main form will be opened
MainForm _MainForm = new MainForm();
this.Hide();
_MainForm.ShowDialog();
this.Close();
}
}
}
以下是程序运行9小时后抛出的错误:
问题是什么:
现在,当我运行程序时SplashScreen
加载,然后打开MainForm
(因为System.txt
存在)并且应用程序运行良好,但是在运行了9个小时之后应用程序抛出错误“值不能为空”,它指向ShowDialog
方法(如屏幕截图所示)。请注意,即使我不使用该应用程序也会发生错误(我只需按F5并等待9小时直到发生错误)。
当我将应用程序设置为首先MainForm
开始(在Program.cs
上)时,应用程序可以在很长时间内无误地运行,我的意思是它可以运行一天没有此错误。仅当程序以splashScreen
表单(Application.Run(new SplashScreen())
)
我试图解决这个问题:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SplashScreen());
}
}
我尝试Show()
方法而不是ShowDialog()
,并且应用程序抛出相同的错误,但这次错误指向Application.Run(new SplashScreen())
上的Programe.cs
(见上文)
我也尝试了MainForm _MainForm = new MainForm() { Owner = this };
我也尝试了_MainForm.ShowDialog(this);
我也尝试了_MainForm.ShowDialog(); Application.DoEvents();
我尝试的所有操作都会导致相同的错误“值不能为空”且错误指向_MainForm.ShowDialog();
现在5天我一直试图解决这个问题,但我不能,每次用SplashScreen
运行应用程序时,它会在9小时之后(为什么9小时?)给出这个错误。我理解变量可以是null而不是方法,那么ShowDialog
如何为空?任何人都知道为什么ShowDialog
在长时间运行后抛出错误?我很乐意听到其他想法如何从MainForm
打开SplashScreen
并保持打开很长时间?
请花5分钟帮助我,我真的很绝望,每一个小帮助都可以解决这个问题。非常感谢您的进步。