C# 运行多个应用程序时出现问题-System.InvalidOperationException

C# 运行多个应用程序时出现问题-System.InvalidOperationException,c#,winforms,C#,Winforms,我目前正在开发一个windows窗体应用程序,我有一个小问题,完全阻碍了我 我的问题是: 在program.cs文件中,我执行了第一个表单,该表单允许我检查此人是否与Internet连接良好。验证完成后,我想关闭此表单并打开我的应用程序,我尝试了application.Run(new App()),但它告诉我不能在一个线程中执行两次启动 // program.cs using System; using System.Windows.Forms; using System.Net; using

我目前正在开发一个windows窗体应用程序,我有一个小问题,完全阻碍了我

我的问题是: 在program.cs文件中,我执行了第一个表单,该表单允许我检查此人是否与Internet连接良好。验证完成后,我想关闭此表单并打开我的应用程序,我尝试了
application.Run(new App()),但它告诉我不能在一个线程中执行两次启动

// program.cs

using System;
using System.Windows.Forms;
using System.Net;
using System.Net.Http;
using System.IO;
using Newtonsoft.Json;

namespace MyApp
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Loading());
        }

        public static bool CheckInternet()
        {
            try {
                using (var web = new WebClient())
                using (web.OpenRead("http://google.com"))
                    return true;
            } catch {
                return false;
            }
        }
    }
}
我希望能解释清楚。如果你有任何问题,不要犹豫


感谢所有有时间帮助我的人。

这里可以为控制流执行各种实现(我认为@jimi关于使用
DialogResult
的评论是一种不错的方法),但重要的是,不要尝试执行嵌套的
应用程序。运行
调用

在这个实现中,我们将关闭
加载
表单
,它将在
Main
中继续执行。请注意,执行
Application.Exit
也将继续在
Main
中执行,但实际上它不会运行任何新表单。因此,您确实有一个场景,我们可以在其中添加该行为(无论您是否真正打算使用该行为,都取决于您的需求)

其次,

我们将移动
Application.Exit()
程序的else块。检查Internet
条件检查

我们将删除
应用程序。从
StartApp

我们将在现在命名不正确的
StartApp
函数范围中执行
Loading
表单

public Loading()
{
    InitializeComponent();
    this.text_version.Text = "0.0.0.1";

    if (Program.CheckInternet())
    {
        var timer = new System.Windows.Forms.Timer();
        timer.Interval = 2000;
        timer.Tick += (s, e) =>
        {
            timer.Stop();
            StartApp();
        };

        timer.Start();
    } else {
        Application.Exit();
    }

}

private void StartApp()
{
    this.l_info.Text = "Starting app...";
    this.l_info.Location = new System.Drawing.Point(70, 270);

    Close(); //this.Close for Form instance close, not Application.Exit
}

我们需要一个。您可以使用
Someform.ShowDialog()
而不是
Application.Run(new Someform())。调用
Application.Run(newmainform())。如果你真的需要一张表格来检查此人是否与互联网连接良好,那就是。我不明白为什么,但是…继续,并包括异常/错误,也许用“在执行多个应用程序运行调用时抛出”之类的情绪更新您的问题标题,这应该会改善这一点question@Jimi我试着放一个
ShowDialog()
应用程序前面。运行
但我仍然得到相同的错误
系统。InvalidOperationException
您尝试了什么?您是否尝试过移动
应用程序.Run(新应用程序())超出
StartApp
范围及以下
应用程序。运行(新加载())
Main
中?我修改它可以正常工作,但文本仍然存在相同的问题,没有时间更改。否则我只是想将时间(例如)增加到5000,然后检查到2000并更改为新文本。你认为这是一件好事吗?这个答案的真正目的是解决这个异常,并演示如何成功地运行应用程序。运行两次(运行两个单独的表单实例..但不是同时运行);对于这个与启动应用程序的状态/进度相关的splashscreen功能,更好的实现和方法是使用线程。我查看了文档:我尝试了,但我不理解线程是如何工作的,因为最终它在完成之前不会显示表单。
[STAThread]
static void Main()
{
   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   Application.Run(new Loading());
   Application.Run(new App());
}
public Loading()
{
    InitializeComponent();
    this.text_version.Text = "0.0.0.1";

    if (Program.CheckInternet())
    {
        var timer = new System.Windows.Forms.Timer();
        timer.Interval = 2000;
        timer.Tick += (s, e) =>
        {
            timer.Stop();
            StartApp();
        };

        timer.Start();
    } else {
        Application.Exit();
    }

}

private void StartApp()
{
    this.l_info.Text = "Starting app...";
    this.l_info.Location = new System.Drawing.Point(70, 270);

    Close(); //this.Close for Form instance close, not Application.Exit
}