C# 为什么应用程序抛出错误“;值不能为空";关于ShowDialog方法?

C# 为什么应用程序抛出错误“;值不能为空";关于ShowDialog方法?,c#,C#,我花了5天时间试图解决这个问题,但我失败了 我是c#新手,我使用的是windows窗体。我构建了一个由20个表单组成的应用程序。应用程序从2个表单开始(SplashScreen和MainForm)SplashScreen表单有计时器和进度条,MainForm有10个按钮,每个按钮打开其他表单。当此应用程序运行时,首先加载SplashScreen表单,当progressBar完成时,检查System.txt文件是否存在,如果存在,则加载MainForm表单: 溅屏形式: public partia

我花了5天时间试图解决这个问题,但我失败了

我是c#新手,我使用的是windows窗体。我构建了一个由20个表单组成的应用程序。应用程序从2个
表单开始(
SplashScreen
MainForm
SplashScreen
表单有计时器和进度条,
MainForm
有10个按钮,每个按钮打开其他表单。当此应用程序运行时,首先加载
SplashScreen
表单,当
progressBar
完成时,检查
System.txt
文件是否存在,如果存在,则加载
MainForm
表单:

溅屏形式:

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小时后抛出的错误:

问题是什么:

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());
    }
}
现在,当我运行程序时,
SplashScreen
加载,然后它打开
MainForm
(因为
System.txt
存在),应用程序运行得很好,但是在运行应用程序整整9个小时后,它抛出错误“Value cannot be null”,并指向
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());
    }
}
静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(新的SplashScreen());
}
}
  • 我尝试了
    Show()
    方法而不是
    ShowDialog()
    ,应用程序抛出了相同的错误,但这次错误指向了
    application.Run(new SplashScreen())
    (参见上文)

  • 我还尝试了
    MainForm\u MainForm=newmainform(){Owner=this};

  • 我还尝试了
    \u MainForm.ShowDialog(此);

  • 我还尝试了
    \u MainForm.ShowDialog();Application.DoEvents();

    我尝试的所有操作都导致了相同的错误“Value cannot be null”,错误点位于
    \u MainForm.ShowDialog();

现在5天来,我一直在尝试解决这个问题,但我无法解决,每次我使用
SplashScreen
运行应用程序时,它都会在9小时后(为什么是9小时?)出现这个错误。我知道变量可以为null而不是方法,那么
ShowDialog
怎么可能为null?有人知道为什么
ShowDialog
在长时间运行后会抛出错误吗?我很高兴听到其他关于如何从
SplashScreen
打开
MainForm
并保持其长时间打开的想法


请花5分钟来帮助我,我真的很绝望,每一个小小的帮助都可以解决这个问题。非常感谢高级版。

为什么要将mainform作为模式加载?只有在模式方法返回时才会调用启动屏幕关闭,而模式关闭时才会调用启动屏幕关闭。请尝试使用
\u mainform.Show()
您似乎多次执行
MainForm\u MainForm=new MainForm()
。您可能不应该这样做,只需创建一次,每次需要时都使用同一个实例。@Wjdavis5.我对c不熟悉#我不知道您所说的模态是什么意思?我已经尝试过使用_MainForm.Show();但它会引发与我所说的相同的错误。您是否有堆栈跟踪?这可能会让您了解引发错误的原因。问题显然更深。问题(直接)不是
Show
ShowDialog
。他们不会抛出
ArgumentNullException
。它必须由某个方法或构造函数抛出,该方法或构造函数在初始化后在
MainForm
自身内执行。获取完整的stracktrace,并发布
MainForm
自身的代码。。为什么要将MainForm作为模式加载?启动屏幕关闭时不会得到called直到模态方法返回,直到模态关闭才会发生。尝试使用
\u mainForm.Show();
您似乎在执行
mainForm\u mainForm=new mainForm()
多次。您可能不应该这样做,只需创建一次,每次需要时都使用相同的实例即可。@Wjdavis5.我对c不熟悉#我不知道您所说的模态是什么意思?我已经尝试使用_mainForm.Show();但它会引发与我所说的相同的错误。您是否有堆栈跟踪?这可能会让您了解引发错误的原因。问题显然更深。问题(直接)不是
Show
ShowDialog
。他们不会抛出
ArgumentNullException
。它必须由某个方法或构造函数抛出,该方法或构造函数在初始化后在
MainForm
自身内执行。获取完整的stracktrace,并发布
MainForm
自身的代码。。