C# 加载另一个表单后关闭表单

C# 加载另一个表单后关闭表单,c#,forms,oop,loading,C#,Forms,Oop,Loading,我打算开发一个简单的应用程序,有一个主窗体和几个子窗体 首先,我创建了加载表单(加载表单有2个IMG和1个Label,1个IMG和1个GIF),该表单只工作几秒钟。接下来我创建了另一个表单(该表单应该是登录表单)。现在,我需要在加载或显示第二个表单后关闭第一个表单。以下是我的第一张表格中的代码: public partial class Loading : Form { private static System.Timers.Timer aTimer; public Load

我打算开发一个简单的应用程序,有一个主窗体和几个子窗体

首先,我创建了加载表单(加载表单有2个IMG和1个Label,1个IMG和1个GIF),该表单只工作几秒钟。接下来我创建了另一个表单(该表单应该是登录表单)。现在,我需要在加载或显示第二个表单后关闭第一个表单。以下是我的第一张表格中的代码:

public partial class Loading : Form
{
    private static System.Timers.Timer aTimer;

    public Loading()
    {
        InitializeComponent();
        this.FormBorderStyle = FormBorderStyle.None;
        Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 10, 10));
        aTimer = new System.Timers.Timer();
        Random rnd = new Random();
        int loading_time = rnd.Next(2500, 4200);
        aTimer.Interval = loading_time;
        aTimer.SynchronizingObject = this; //////////////
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Enabled = true;

    }




    private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
       // New Form run 1st try
        login form2 = new login();
        form2.ShowDialog();

      // New Form run 2nd try
        Application.Run(new login());

      // Loading form closing 1st try
      this.Close();

         // Loading form closing 2nd try
      Loading.Close();
我还试图用第二个窗体上的按钮关闭第一个窗体,但没有成功。
提前感谢。

除了创建控件的线程之外,您无法从其他线程访问控件

OnTimedEvent
在主线程以外的线程中调用

编辑: 试试这个

aTimer.synchroningobject=this


这将使
ontimedend
在创建表单的线程上运行。

此外,了解运行此代码时发生的情况也会很有帮助。@Grant-我不知道,我试图停止计时器,但没有帮助。@zmarks22加载开始,然后,突然发生了意外的事情:
code
System.Windows.Forms.dll中发生了“System.InvalidOperationException”类型的异常,但未在用户代码中处理。其他信息:跨线程操作无效:控件“加载”是从创建它的线程以外的线程访问的。如果存在此异常的处理程序,则程序可以安全地继续。
code
@MarkHall这是真的,但它甚至不会关闭我的整个应用程序。我试图将该表单的状态更改为“非主”,但我不知道如何更改…请不要发布与问题无关的帖子。我看不出CreateRoundRectRgn方法的结果在代码中的何处使用。这只会让阅读变得更困难。尤其是当你在带有滚动条的小窗口中阅读时。但我不能从另一个窗体关闭该窗体。我写道,我试图用另一个窗体中的按钮关闭第一个窗体,但仍然收到相同的意外错误。。。请按照我在您的问题下所描述的方式清理代码。然后显示带有行号的stacktrace(格式化)。我告诉您要尝试的代码在哪里?stacktrace在哪里?